2015-10-14 2 views
2

Supposons que j'ai deux versions presque identiques d'un paquet python mymod, c'est-à-dire mymod0 et mymod1. Chacun de ces packages contient les fichiers init .py et foo.py et foo.py a une seule fonction printme(). Appeler mymod0.foo.printme() affichera "Je suis mymod0" et l'appel de mymod1.foo.printme() affichera "Je suis mymod1". Jusqu'ici tout va bien. Mais maintenant, je dois importer dynamiquement mymod0 ou mymod1. L'utilisateur entrée 0 ou 1 au script (comme variable "index"), et je peux créer packageName = "mymod" + str (index)Charger dynamiquement un paquet en python

J'ai essayé ceci:

module=importlib.import_module(module_name) 
module.foo.printme() 

Mais Je reçois cette erreur: AttributeError: l'objet 'module' n'a pas d'attribut 'foo'

Comment est-ce que je peux spécifier que le paquet devrait être appelé module pour que module.foo.printme() fonctionne?

MISE À JOUR: Il semble donc que la solution la plus simple consiste à utiliser la fonction exec(). De cette façon, je peux créer dynamiquement une instruction import comme ceci:

cmdname="from mymod%s import foo" % index 
exec(cmdname) 

Puis:

foo.printme() 

Cela semble fonctionner.

Répondre

0

How can I specify the the package should now be referred to as module so that module.foo.printme() will work?

Vous devez vous assurer <module_name>.__init__ les importations foo dans l'espace de noms du module:

#./<module_name>/__init__.py 
import foo 

alors vous pouvez

module=importlib.import_module(module_name) 
module.foo.printme() 

But now I need to dynamically import either mymod0 or mymod1.

Notez cela ne fonctionne que la première fois parce que les caches de python modules chargés. Si le module a changé depuis le début du programme, utilisez la fonction reload function. Juste un mot d'avertissement: Il y a plusieurs mises en garde associées à cela, et il se peut que vous n'agissiez pas comme prévu.

How can I recreate this dynamically?

for i in range(0,2): 
    module_name = 'mymod%s' % i 
    module=importlib.import_module(module_name) 
    module.foo.printme() 
+0

Ok c'est proche, mais ce que je veux faire est de recréer dynamiquement cette importation: mymod0 d'importation comme mymod. Donc, ici mymob se réfère maintenant au paquet mymod0. Si je le fais de manière statique, alors je peux appeler mymod0.foo.printme() sans problème. Comment puis-je recréer ceci dynamiquement? – Marc

+0

@Marc s'il vous plaît voir ma modification. note que je n'ai pas testé ce – miraculixx