我有一个如下所示的目录结构:
.
├── superclass
│ ├── __init__.py
│ └── superclass.py
├── tests
│ ├── __init__.py
│ └── test_subclass.pyc
└── subclass
├── __init__.py
├── a.py
├── b.py
└── subclass.py
在subclass.py我有一个类Subclass,它继承自Superclass. 在Subclass.__init__中,我调用self.register("subclass", ["a", "b"]),其定义Superclass为:
def register(self, package, module_names):
for name in module_names:
module = importlib.import_module(name, package)
functions = inspect.getmembers(module, inspect.isfunction)
for register in functions:
if register[0].startswith("register"):
register[1](self)
subclass.py还包含:
if __name__ == "__main__":
Subclass().do_something()
当我跑步时python subclass/subclass.py,一切都按我的预期进行;模块a和b被导入,并且register每个模块中的所有功能都正确运行。
在test_subclass中,我有from subclass.subclass import Subclass,并且我调用了Subclass构造函数。但是,当我运行时py.test,我得到了错误ImportError: No module named b。模块导入正常,a但b模块失败。
我尝试颠倒导入的顺序 ( self.register("subclass", ["b", "a"]),但它仍然在b.
Module比 modulea有更多的import 语句b(我还有其他文件没有在目录图中显示),当我将所有a的导入添加到b.
这是动态导入模块的正确方法吗?如果是这样,我错过了什么吗?如果不是,我是否将错误的论点传递给import_module?
注意,我使用的是 python 2.7。