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