正如here所讨论的,我们可以使用字符串变量动态导入模块。
import importlib
importlib.import_module('os.path')
我的问题是如何从字符串变量import *
?
这样的事情现在不起作用
importlib.import_module('os.path.*')
答案 0 :(得分:17)
您可以执行以下操作:
>>> import importlib
>>> globals().update(importlib.import_module('math').__dict__)
>>> sin
<built-in function sin>
请注意,模块中的所有名称都可以在本地使用,因此它与*
略有不同,因为它不是以__all__
开头,因此例如它还会覆盖__name__
,__package__
,__loader__
,__doc__
。
<强>更新强>
这是@mata在comments中指出的更精确,更安全的版本:
module = importlib.import_module('math')
globals().update(
{n: getattr(module, n) for n in module.__all__} if hasattr(module, '__all__')
else
{k: v for (k, v) in module.__dict__.items() if not k.startswith('_')
})
特别感谢Nam G VU帮助提高答案的完整性。