モジュールの最上位コードは、最初に実行されたときに 1 回実行されますimport
。その後、モジュール オブジェクトは で見つかり、sys.modules
再生成するためにコードが再実行されることはありません。
これにはいくつかの例外があります:
reload
、 明らかに。
- 誤って同じモジュールを2 つの異なる名前でインポートする (たとえば、モジュールがパッケージ内にあり、パッケージの途中にディレクトリがある
sys.path
場合、.この場合、コードは 2 回実行されます)。mypackage.mymodule
mymodule
- 標準の動作を置き換えるインポート フック/カスタム インポートのインストール。
- で明示的にモンキー
sys.modules
。
imp
/importlib
などから関数を直接呼び出す。
- 特定のケース
multiprocessing
(および のように間接的に使用するモジュールconcurrent.futures
)。
Python 3.1 以降の場合、これはすべてThe import systemで詳しく説明されています。特に、検索セクションを見てください。(multiprocessing
特定のケースは、そのモジュールについて説明されています。)
以前のバージョンの Python では、コードを読んだり実験したりして、さまざまなソースから動作を推測する必要がありました。ただし、十分に文書化された新しい動作は、具体的に説明されている方法を除いて、古い動作のように動作することを目的としているため、通常は 2.x であっても 3.x のドキュメントを読むだけで済みます。
一般に、モジュール内の最上位コードが 1 回実行されるか複数回実行されるかに依存したくないことに注意してください。たとえば、トップレベルの関数定義が与えられた場合、関数オブジェクトを比較したり、関数オブジェクト (本体だけでなく定義自体を意味する) が依存するグローバルを再バインドしたりしない限り、違いはありません。ただし、これにはいくつかの例外があり、開始時の構成ファイルのロードは例外の完全な例です。