Python中的动态导入(点语句)

0 投票
2 回答
1112 浏览
提问于 2025-04-16 01:34

我在使用下面的代码时遇到了问题:

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'>

撰写回答