次のようなディレクトリ構造があります。
.
├── 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
.
Modulea
にはmodule よりも多くのimport ステートメントがありb
(ディレクトリ図には表示されていない他のファイルがあります)、 のすべての import を に追加すると、同じように失敗しa
ますb
。
これはモジュールを動的にインポートする正しい方法ですか? もしそうなら、私は何かが欠けていますか?そうでない場合、間違った引数を に渡していますimport_module
か?
注、私はpython 2.7を使用しています。