Ce que vous essayez de faire à votre espace de noms local n'est pas clair. Je suppose que vous voulez juste my_method
comme un local, en tapant output = my_method()
?
# This is equivalent to "from a.b.myfile import my_method"
the_module = importlib.import_module("a.b.myfile")
same_module = __import__("a.b.myfile")
# import_module() and __input__() only return modules
my_method = getattr(the_module, "my_method")
# or, more concisely,
my_method = getattr(__import__("a.b.myfile"), "my_method")
output = my_method()
Alors que vous ajoutez seulement my_method
dans l'espace de nom local, vous chargez la chaîne de modules. Vous pouvez observer les changements en regardant les clés de sys.modules
avant et après l'importation. J'espère que ceci est plus clair et plus précis que vos autres réponses.
Pour être complet, voici comment ajouter l'ensemble de la chaîne.
# This is equivalent to "import a.b.myfile"
a = __import__("a.b.myfile")
also_a = importlib.import_module("a.b.myfile")
output = a.b.myfile.my_method()
# This is equivalent to "from a.b import myfile"
myfile = __import__("a.b.myfile", fromlist="a.b")
also_myfile = importlib.import_module("a.b.myfile", "a.b")
output = myfile.my_method()
Et, enfin, si vous utilisez __import__()
et que vous avez modifié le chemin de recherche après le démarrage du programme, vous devrez peut-être utiliser la méthode suivante __import__(normal args, globals=globals(), locals=locals())
. Le pourquoi est une discussion complexe.