Непонятно, что вы пытаетесь сделать со своим локальным пространством имен. Полагаю, вы хотите, my_method
как местный житель, печатать 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()
Хотя вы только добавляете my_method
в локальное пространство имен, вы загружаете цепочку модулей. Вы можете просмотреть изменения, просмотрев ключи sys.modules
до и после импорта. Я надеюсь, что это яснее и точнее, чем другие ваши ответы.
Для полноты, вот как вы добавляете всю цепочку.
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()
И, наконец, если вы используете __import__()
и изменили свой путь поиска после запуска программы, вам может потребоваться использовать __import__(normal args, globals=globals(), locals=locals())
. Почему - сложное обсуждение.
importlib.import_module()
over__import__()
: docs.python.org/2/library/functions.html#__import__ - для 2.7+.