【发布时间】:2013-09-27 06:30:02
【问题描述】:
我想在不知道它的名字的情况下导入一个子模块,
>>> __import__("os.path")
<module 'os' from '/usr/lib/python3.3/os.py'>
不像你想象的那样工作,返回os,而不是os.path。
我想出了这个解决方案。
def import_submodule(mod, submod):
ns = {}
exec_str = "from %s import %s as submod" % (mod, submod)
exec(exec_str, ns, ns)
return ns["submod"]
这给出了结果:
>>> import_submodule("os", "path")
<module 'posixpath' from '/usr/lib/python3.3/posixpath.py'>
但是我宁愿不使用 exec(),因为它的做法很糟糕,而且当 Python 的导入机制已经通过 __import__、imp 和 importlib 模块可用时,它似乎没有必要。
Python3.x 中有没有办法通过函数调用而不是使用exec() 来进行这种导入?
【问题讨论】:
-
注意
name.split('.'),然后循环使用getattr()来检索“子对象”;.path在你的情况下。 -
将您的示例基于
os.path可能会让您大吃一惊,因为it doesn't necessarily work like other modules -
@ideasman42:
__import__('parentmodule.submodule')确实 导入submodule但返回parentmodule。 -
@MartijnPieters 我认为这不应该被视为重复,因为 OP 明确针对 python3.3 存在更好的答案(即
importlib),答案中没有引用另一个问题。将此标记为重复可能意味着人们仍将使用其他自制解决方案而不是新的进口机器。在当前版本的 python 中,您几乎不需要直接调用__import__。
标签: python python-3.x python-import