次のようなディレクトリ構造があります。
.
├── superclass
│ ├── __init__.py
│ └── superclass.py
├── tests
│ ├── __init__.py
│ └── test_subclass.pyc
└── subclass
├── __init__.py
├── a.py
├── b.py
└── subclass.py
には、から継承subclass.pyするクラスがあります。では、次のように定義されているを呼び出します。SubclassSuperclassSubclass.__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を使用しています。