我想進口的子模塊事先不知道它的名字,如何導入在Python的子模塊(不`exec`)
>>> __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'>
然而,因爲當蟒蛇進口機制可已通過__import__
,imp
和importlib
模塊及其很壞的做法,似乎沒有必要我寧可不使用EXEC() 。
在Python3.x中有沒有辦法通過函數調用來完成這種導入,而不是使用exec()
?
可能重複的[如何動態加載Python類](http://stackoverflow.com/questions/547829/how-to-dynamically-load-a-python-class) –
請注意'name.split( '。')',然後循環使用'getattr()'來檢索'子對象'; '.path'在你的情況下。 –
將'os.path'放在你的例子可能會導致你瘋狂的追逐,因爲[它不一定像其他模塊一樣工作](http://stackoverflow.com/a/2725195/1222578) – Marius