Неясно, что вы пытаетесь сделать со своим локальным пространством имен.Я предполагаю, что вы хотите просто my_method
как локальный, набрав 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()
Пока вы только добавляете my_method
в локальное пространство имен, вы загружаете цепочку модулей.Вы можете посмотреть изменения, наблюдая за клавишами sys.modules
до и после импорта.Надеюсь, что это яснее и точнее, чем другие ваши ответы.
Для полноты, вот как вы добавляете всю цепочку.
# 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()
И, наконец, если вы используете __import__()
и изменили свой путь поиска после запуска программы, возможно, вам придется использовать __import__(normal args, globals=globals(), locals=locals())
.Почему это сложная дискуссия.