runpy — Pythonモジュールの検索と実行—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/runpy
移動先:案内検索

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コマンドラインの詳細

importlib.import_module()関数