Nie jest jasne, co próbujesz zrobić z lokalną przestrzenią nazw. Zakładam, że chcesz tylko my_method
jako lokalny, piszący 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()
Chociaż dodajesz tylko my_method
do lokalnej przestrzeni nazw, ładujesz łańcuch modułów. Możesz przyjrzeć się zmianom, obserwując klawisze sys.modules
przed i po imporcie. Mam nadzieję, że to jest jaśniejsze i dokładniejsze niż twoje inne odpowiedzi.
Aby uzyskać kompletność, w ten sposób dodajesz cały łańcuch.
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()
I wreszcie, jeśli używasz __import__()
i zmodyfikowałeś ścieżkę wyszukiwania po uruchomieniu programu, być może będziesz musiał użyć __import__(normal args, globals=globals(), locals=locals())
. Dlaczego jest to złożona dyskusja.
importlib.import_module()
over__import__()
: docs.python.org/2/library/functions.html#__import__ - dla wersji 2.7+.