0

私はこのようなファイル構造を持っています:

dir_a
    __init__.py
    mod_1.py
    mod_2.py
dir_b
    __init__.py
    my_mod.py

のすべてのモジュールを動的にインポートしたいのですが、そのためdir_amy_mod.py、の中に次のものが__init__.pyありdir_aます。

import os
import glob
__all__ = [os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(os.path.abspath(__file__)) + "/*.py")]

しかし、私がそうするとき:

from dir_a import *

私は得るImportError: No module named dir_a

これは何が原因なのだろうか。親ディレクトリにPYTHONPATHが含まdir_aれている必要があるためですか?dir_bさらに、上記のアプローチは、my_mod.py実行時にすべてを取得するという意味でのみ動的ですが、実行中に新しいモジュールが追加された場合、dir_aこの新しいモジュールは取得されません。では、真に動的なインポートメカニズムを実装することは可能ですか?

4

1 に答える 1

1

あなたの質問の最初の部分への答えは些細なはいです:をimport dir_a含むディレクトリがdir_a検索パスにない場合はできません。

2番目の部分では、一般的にそれが可能であるとは思いません-で「ファイルが作成された」OS信号をリッスンしdir_a作成されたファイルがであるかどうかを確認し.py、に追加することができますdir_a.__all__-しかし、それは複雑で、おそらく高価であり、インポート時from foo import *に何が入っているかを確認するだけなので、グローバル名前空間に新しいものをさかのぼって追加することはありません。foo.__all__そして、それを変更するとエラーが発生しやすくなります。これにより、予測できない外部イベントに基づいていつでも名前空間を変更できます。あなたがこれをすると言う:

from dir_a import *
bar = 5

そして、bar.pyにが追加されdir_aます。そのような状況を考慮し、何をしたいのかを決めずに「真にダイナミックなインポーター」を書くことはできません。

于 2012-06-15T15:46:07.637 に答える