31.7。 ランピー —Pythonモジュールの検索と実行
バージョン2.5の新機能。
ソースコード: :source: `Lib / runpy.py`
runpy モジュールは、Pythonモジュールを最初にインポートせずに見つけて実行するために使用されます。 その主な用途は、 -m コマンドラインスイッチを実装することです。これにより、ファイルシステムではなくPythonモジュール名前空間を使用してスクリプトを見つけることができます。
runpy モジュールは、次の2つの機能を提供します。
- runpy.run_module(mod_name, init_globals=None, run_name=None, alter_sys=False)
指定されたモジュールのコードを実行し、結果のモジュールグローバルディクショナリを返します。 モジュールのコードは、最初に標準のインポートメカニズム(詳細については PEP 302 を参照)を使用して検索され、次に新しいモジュール名前空間で実行されます。
指定されたモジュール名が通常のモジュールではなくパッケージを参照している場合、そのパッケージがインポートされ、そのパッケージ内の
__main__
サブモジュールが実行され、結果のモジュールグローバルディクショナリが返されます。オプションのディクショナリ引数 init_globals を使用して、コードが実行される前にモジュールのグローバルディクショナリを事前入力できます。 提供された辞書は変更されません。 以下の特別なグローバル変数のいずれかが提供されたディクショナリで定義されている場合、それらの定義は run_module()によってオーバーライドされます。
特別なグローバル変数
__name__
、__file__
、__loader__
、および__package__
は、モジュールコードが実行される前にグローバルディクショナリに設定されます(これは最小限であることに注意してください)変数のセット-他の変数は、インタープリター実装の詳細として暗黙的に設定される場合があります)。このオプションの引数が None でない場合、
__name__
は run_name に設定され、指定されたモジュールがパッケージの場合はmod_name + '.__main__'
に設定され、に設定されます。それ以外の場合はmod_name 引数。__file__
は、モジュールローダーによって提供された名前に設定されます。 ローダーがファイル名情報を利用可能にしない場合、この変数は None に設定されます。__loader__
は、モジュールのコードを取得するために使用される PEP 302 モジュールローダーに設定されます(このローダーは、標準のインポートメカニズムのラッパーである可能性があります)。__package__
は、指定されたモジュールがパッケージの場合は mod_name に設定され、それ以外の場合はmod_name.rpartition('.')[0]
に設定されます。引数 alter_sys が指定され、 True と評価された場合、
sys.argv[0]
は__file__
の値で更新され、sys.modules[__name__]
は次のようになります。実行中のモジュールの一時モジュールオブジェクトで更新されます。sys.argv[0]
とsys.modules[__name__]
はどちらも、関数が戻る前に元の値に復元されます。この sys の操作はスレッドセーフではないことに注意してください。 他のスレッドは、部分的に初期化されたモジュールと、変更された引数のリストを見る場合があります。 スレッドコードからこの関数を呼び出すときは、 sys モジュールをそのままにしておくことをお勧めします。
も参照してください
-m オプションは、コマンドラインから同等の機能を提供します。
バージョン2.7で変更:
__main__
サブモジュールを探すことでパッケージを実行する機能が追加されました
- 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__
、__file__
、__loader__
、および__package__
は、モジュールコードが実行される前にグローバルディクショナリに設定されます(これは最小限であることに注意してください)変数のセット-他の変数は、インタープリター実装の詳細として暗黙的に設定される場合があります)。このオプションの引数が None でない場合、
__name__
は run_name に設定され、それ以外の場合は'<run_path>'
に設定されます。__file__
は、モジュールローダーによって提供された名前に設定されます。 ローダーがファイル名情報を利用可能にしない場合、この変数は None に設定されます。 単純なスクリプトの場合、これはfile_path
に設定されます。__loader__
は、モジュールのコードを取得するために使用される PEP 302 モジュールローダーに設定されます(このローダーは、標準のインポートメカニズムのラッパーである可能性があります)。 単純なスクリプトの場合、これは None に設定されます。__package__
は__name__.rpartition('.')[0]
に設定されます。sys モジュールにもいくつかの変更が加えられています。 まず、
sys.path
は上記のように変更できます。sys.argv[0]
はfile_path
の値で更新され、sys.modules[__name__]
は実行中のモジュールの一時モジュールオブジェクトで更新されます。 sys の項目に対するすべての変更は、関数が戻る前に元に戻されます。run_module()とは異なり、 sys に加えられた変更は、sys.pathエントリの実行を許可するために不可欠であるため、この関数ではオプションではないことに注意してください。 スレッドセーフの制限が引き続き適用されるため、スレッドコードでのこの関数の使用は、インポートロックを使用してシリアル化するか、別のプロセスに委任する必要があります。
も参照してください
コマンドラインで同等の機能を提供するインターフェイスオプション(
python path/to/script
)。バージョン2.7の新機能。
も参照してください
- PEP 338 –モジュールをスクリプトとして実行
- Nick Coghlanによって作成および実装されたPEP。
- PEP 366 –メインモジュールの明示的な相対インポート
- Nick Coghlanによって作成および実装されたPEP。
コマンドラインと環境 -CPythonコマンドラインの詳細