目前尚不清楚您要对本地命名空间做什么。我假设你想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())
. 为什么是一个复杂的讨论。