runpy —Pythonモジュールの検索と実行
ソースコード: :source: `Lib / runpy.py`
runpy モジュールは、Pythonモジュールを最初にインポートせずに見つけて実行するために使用されます。 その主な用途は、 -m コマンドラインスイッチを実装することです。これにより、ファイルシステムではなくPythonモジュール名前空間を使用してスクリプトを見つけることができます。
これはサンドボックスモジュールではなくであることに注意してください。すべてのコードは現在のプロセスで実行され、関数が戻った後も副作用(他のモジュールのキャッシュされたインポートなど)はそのまま残ります。
さらに、実行されたコードによって定義された関数およびクラスは、 runpy 関数が返された後に正しく機能することが保証されていません。 その制限が特定のユースケースで受け入れられない場合は、 importlib がこのモジュールよりも適切な選択である可能性があります。
runpy モジュールは、次の2つの機能を提供します。
- runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)
指定されたモジュールのコードを実行し、結果のモジュールグローバルディクショナリを返します。 モジュールのコードは、最初に標準のインポートメカニズム(詳細については PEP 302 を参照)を使用して検索され、次に新しいモジュール名前空間で実行されます。
mod_name 引数は絶対モジュール名である必要があります。 モジュール名が通常のモジュールではなくパッケージを参照している場合、そのパッケージがインポートされ、そのパッケージ内の
__main__
サブモジュールが実行され、結果のモジュールグローバルディクショナリが返されます。オプションのディクショナリ引数 init_globals を使用して、コードが実行される前にモジュールのグローバルディクショナリを事前入力できます。 提供された辞書は変更されません。 以下の特別なグローバル変数のいずれかが提供されたディクショナリで定義されている場合、それらの定義は run_module()によってオーバーライドされます。
特別なグローバル変数
__name__
、__spec__
、__file__
、__cached__
、__loader__
、__package__
がグローバルに設定されますモジュールコードが実行される前の辞書(これは最小限の変数セットであることに注意してください。他の変数は、インタープリター実装の詳細として暗黙的に設定される場合があります)。このオプションの引数が None でない場合、
__name__
は run_name に設定され、指定されたモジュールがパッケージの場合はmod_name + '.__main__'
に設定され、に設定されます。それ以外の場合はmod_name 引数。__spec__
は、実際にインポートされたモジュールに適切に設定されます(つまり、__spec__.name
は常に mod_name またはmod_name + '.__main__
になります。 run_name )。__file__
、__cached__
、__loader__
、__package__
は、モジュール仕様に基づいて通常に設定されます。引数 alter_sys が指定され、 True と評価された場合、
sys.argv[0]
は__file__
の値で更新され、sys.modules[__name__]
は次のようになります。実行中のモジュールの一時モジュールオブジェクトで更新されます。sys.argv[0]
とsys.modules[__name__]
はどちらも、関数が戻る前に元の値に復元されます。この sys の操作はスレッドセーフではないことに注意してください。 他のスレッドは、部分的に初期化されたモジュールと、変更された引数のリストを見る場合があります。 スレッドコードからこの関数を呼び出すときは、 sys モジュールをそのままにしておくことをお勧めします。
も参照してください
-m オプションは、コマンドラインから同等の機能を提供します。
バージョン3.1で変更:
__main__
サブモジュールを探すことでパッケージを実行する機能が追加されました。バージョン3.2で変更:
__cached__
グローバル変数が追加されました( PEP 3147 を参照)。バージョン3.4で変更: PEP 451 によって追加されたモジュール仕様機能を利用するように更新されました。 これにより、この方法で実行されるモジュールに対して
__cached__
を正しく設定できるだけでなく、実際のモジュール名に常に__spec__.name
としてアクセスできるようになります。
- runpy.run_path(file_path, init_globals=None, run_name=None)
指定されたファイルシステムの場所でコードを実行し、結果のモジュールグローバルディクショナリを返します。 CPythonコマンドラインに提供されるスクリプト名と同様に、提供されるパスは、Pythonソースファイル、コンパイルされたバイトコードファイル、または
__main__
モジュールを含む有効なsys.pathエントリを参照する場合があります(例: トップレベルの__main__.py
ファイルを含むzipファイル)。単純なスクリプトの場合、指定されたコードは新しいモジュール名前空間で実行されるだけです。 有効なsys.pathエントリ(通常はzipファイルまたはディレクトリ)の場合、エントリは最初に
sys.path
の先頭に追加されます。 次に、関数は、更新されたパスを使用して __ main __ モジュールを検索して実行します。 指定された場所にそのようなモジュールがない場合、sys.path
の他の場所にある既存の __ main __ エントリを呼び出すことに対する特別な保護はないことに注意してください。オプションのディクショナリ引数 init_globals を使用して、コードが実行される前にモジュールのグローバルディクショナリを事前入力できます。 提供された辞書は変更されません。 以下の特別なグローバル変数のいずれかが提供されたディクショナリで定義されている場合、それらの定義は run_path()によってオーバーライドされます。
特別なグローバル変数
__name__
、__spec__
、__file__
、__cached__
、__loader__
、__package__
がグローバルに設定されますモジュールコードが実行される前の辞書(これは最小限の変数セットであることに注意してください。他の変数は、インタープリター実装の詳細として暗黙的に設定される場合があります)。このオプションの引数が None でない場合、
__name__
は run_name に設定され、それ以外の場合は'<run_path>'
に設定されます。指定されたパスがスクリプトファイルを直接参照している場合(ソースまたはプリコンパイルされたバイトコードとして)、
__file__
が指定されたパスに設定され、__spec__
、__cached__
、__loader__
と__package__
はすべてなしに設定されます。指定されたパスが有効なsys.pathエントリへの参照である場合、インポートされた
__main__
モジュールに対して__spec__
が適切に設定されます(つまり、__spec__.name
は常に[ X173X] )。__file__
、__cached__
、__loader__
、__package__
は、モジュール仕様に基づいて通常に設定されます。sys モジュールにもいくつかの変更が加えられています。 まず、
sys.path
は上記のように変更できます。sys.argv[0]
はfile_path
の値で更新され、sys.modules[__name__]
は実行中のモジュールの一時モジュールオブジェクトで更新されます。 sys の項目に対するすべての変更は、関数が戻る前に元に戻されます。run_module()とは異なり、 sys に加えられた変更は、sys.pathエントリの実行を許可するために不可欠であるため、この関数ではオプションではないことに注意してください。 スレッドセーフの制限が引き続き適用されるため、スレッドコードでのこの関数の使用は、インポートロックを使用してシリアル化するか、別のプロセスに委任する必要があります。
も参照してください
コマンドラインで同等の機能を提供するインターフェイスオプション(
python path/to/script
)。バージョン3.2の新機能。
バージョン3.4で変更: PEP 451 によって追加されたモジュール仕様機能を利用するように更新されました。 これにより、
__main__
が直接実行されるのではなく、有効なsys.pathエントリからインポートされた場合に、__cached__
を正しく設定できます。
も参照してください
- PEP 338 –モジュールをスクリプトとして実行
- Nick Coghlanによって作成および実装されたPEP。
- PEP 366 –メインモジュールの明示的な相対インポート
- Nick Coghlanによって作成および実装されたPEP。
- PEP 451 –インポートシステムのModuleSpecタイプ
- Eric Snowによって作成および実装されたPEP
コマンドラインと環境 -CPythonコマンドラインの詳細