3

次のようなディレクトリ構造があります。

.
├── 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と、すべてが期待どおりに機能します。モジュールabインポートされ、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を使用しています。

4

0 に答える 0