ファイルの場合import、Python は 2 つの異なる手順を実行します。
- インポートしたモジュール ファイルを開き、モジュール内
importのすべてのステートメントを含めて実行します。
- インポートされたモジュールを現在のモジュールの名前空間で使用できるようにします。
fooモジュールをインポートすると、名前空間でによってインポートされたモジュールにアクセスできないことに注意してfooください。直接インポートする必要があります (または 経由foo.moduleでアクセスしますが、通常はモジュールにインポートします)。
つまり、モジュールを使用するすべてのファイルは、同じアプリケーション内の他のファイルがモジュールを使用しfooている場合でも、モジュールをインポートする必要があります。
別の言語から来ている場合に混乱するかもしれないことの 1 つは、Python が特定のモジュールを実際に実行するのは ( を呼び出さない限りreload()) 1 回だけであることです。これが、import上記で up のアクションを 2 つに分割した理由です。最初のアクションは、インポートされたモジュールごとに 1 回だけ実行されますが、2 つ目のアクションは常に発生します。
そのため、import foowhich 自体が実行されると、とimport barの両方が一度ロードされて実行されます。モジュールは にアクセスできますが、インポートしていないためアクセスできません (繰り返しますが、 として使用できますが、通常はあまり良い方法ではありません)。ここで実行すると、モジュールで使用可能になりますが、そのモジュールは既に一度インポートされているため、Python はモジュールを再度ロードして実行しません。foobarfoobarfoo.barimport barbar
詳細が必要な場合は、モジュールの動作の詳細が公式の Python ドキュメントに詳しく記載されています。
それはあなたの質問に答えていますか?
追加の詳細
多くの場合、ディレクトリをスキャンして実行時にモジュールをロードする必要はありませんが、それが役立つ場合があります (プラグインの実装など)。インストールされているモジュールの固定リストから選択するだけの場合は、標準importを実行してキャッチImportErrorし、リストの次を試すことでそれを処理できます。
実行時まで名前がわからないときにモジュールをロードする必要がある場合は、importlibを使用できます。Python 標準ライブラリには、モジュールをインポートするための他のモジュールもいくつか用意されています。たとえば、impにはファイル名でモジュールを検索してインポートする機能があります。
そのための解決策がすでにあるように思えますが、他に何が利用できるかを知っておくと便利な場合があります (これらのモジュールはすべて標準ライブラリの一部であるため、常にインストールされます)。