No está claro qué está intentando hacer con su espacio de nombres local. Supongo que lo quieres solo my_method
como local, escribiendo output = my_method()
?
the_module = importlib.import_module("a.b.myfile")
same_module = __import__("a.b.myfile")
my_method = getattr(the_module, "my_method")
my_method = getattr(__import__("a.b.myfile"), "my_method")
output = my_method()
Si bien solo agrega my_method
al espacio de nombres local, carga la cadena de módulos. Puede ver los cambios observando las claves de sys.modules
antes y después de la importación. Espero que esto sea más claro y preciso que sus otras respuestas.
Para completar, así es como agrega toda la cadena.
a = __import__("a.b.myfile")
also_a = importlib.import_module("a.b.myfile")
output = a.b.myfile.my_method()
myfile = __import__("a.b.myfile", fromlist="a.b")
also_myfile = importlib.import_module("a.b.myfile", "a.b")
output = myfile.my_method()
Y, finalmente, si está usando __import__()
y ha modificado su ruta de búsqueda después de que se inició el programa, es posible que deba usar __import__(normal args, globals=globals(), locals=locals())
. El por qué es una discusión compleja.
importlib.import_module()
over__import__()
: docs.python.org/2/library/functions.html#__import__ - para 2.7+.