3

我有一个如下所示的目录结构:

.
├── 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,一切都按我的预期进行;模块ab被导入,并且register每个模块中的所有功能都正确运行。

test_subclass中,我有from subclass.subclass import Subclass,并且我调用了Subclass构造函数。但是,当我运行时py.test,我得到了错误ImportError: No module named b。模块导入正常,ab模块失败。

我尝试颠倒导入的顺序 ( self.register("subclass", ["b", "a"]),但它仍然在b.

Module比 modulea更多的import 语句b(我还有其他文件没有在目录图中显示),当我将所有a的导入添加到b.

这是动态导入模块的正确方法吗?如果是这样,我错过了什么吗?如果不是,我是否将错误的论点传递给import_module

注意,我使用的是 python 2.7。

4

0 回答 0