Python中的动态导入(点语句)
我在使用下面的代码时遇到了问题:
def get_module(mod_path):
mod_list = mod_path.split('.')
mod = __import__(mod_list.pop(0))
while mod_list:
mod = getattr(mod, mod_list.pop(0))
return mod
当我执行 get_module('qmbpmn.common.db_parsers')
时,出现了错误信息:
AttributeError: 'module' object has no attribute 'db_parsers'
。
但是: import qmbpmn.common.db_parsers
运行得非常顺利。
2 个回答
1
__import__
是可以用带点的模块路径来工作的,所以这样应该没问题
def get_module(mod_path):
return __import__(mod_path)
或者更简单的方式是
get_module = __import__
也许我对问题的理解有误
导入一个包并不会自动把所有的子模块都导入到它的命名空间里。比如说
import qmbpmn
并不意味着
qmbpmn.common.db_parsers
会自动解决
3
当你使用 __import__
来导入子模块时,你需要把父级包作为 fromlist
参数传进去:
>>> __import__("os.path")
<module 'os' from '/usr/lib/python2.6/os.pyc'>
>>> __import__("os.path", fromlist=["os"])
<module 'posixpath' from '/usr/lib/python2.6/posixpath.pyc'>