我有一个如下所示的目录结构:
.
├── 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
定义为:{/ 1>
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
失败。
模块a
具有更多导入语句而不是模块b
(我在目录图中没有显示其他文件),当我添加时它仍然以相同的方式失败所有a
导入b
。
这是动态导入模块的正确方法吗?如果是这样,我错过了什么吗?如果没有,我是否将错误的参数传递给import_module
?
注意,我正在使用python 2.7。