\section{\module{runpy} ---
         Python モジュールの位置特定と実行}

\declaremodule{standard}{runpy}		% standard library, in Python

\moduleauthor{Nick Coghlan}{ncoghlan@gmail.com}

\modulesynopsis{Python モジュールの位置特定とスクリプトとしての実行}

\versionadded{2.5}

\module{runpy} モジュールは Python のモジュールをインポートせずに
その位置を特定したり実行したりするのに使われます。その主な目的は
ファイルシステムではなく Python のモジュール名前空間を使って位置を特定した
スクリプトの実行を可能にする \programopt{-m} コマンドラインスイッチを
実装することです。

スクリプトとして実行されると、このモジュールは効率よく以下の操作をします。
\begin{verbatim}
    del sys.argv[0]  # Remove the runpy module from the arguments
    run_module(sys.argv[0], run_name="__main__", alter_sys=True)
\end{verbatim}

\module{runpy} モジュールでは一つの関数だけ提供します。

\begin{funcdesc}{run_module}{mod_name\optional{, init_globals}
\optional{, run_name}\optional{, alter_sys}}
指定されたモジュールのコードを実行し、実行後のモジュールグローバル辞書を
返します。モジュールのコードはまず標準インポート機構(詳細は PEP 302 を参照)
を使ってモジュールの位置を特定され、まっさらなモジュール名前空間で実行されます。

オプションの辞書型引数 \var{init_globals} はコードを実行する前にグローバル
辞書に前もって必要な設定しておくのに使われます。与えられた辞書は変更されません。
その辞書の中に以下に挙げる特別なグローバル変数が定義されていたとしても、
それらの定義は \code{run_module} 関数によってオーバーライドされます。

特別なグローバル変数 \code{__name__}、\code{__file__}、\code{__loader__}、
\code{__builtins__} はモジュールコードが実行される前にグローバル辞書にセットされます。

\code{__name__} は、もしオプション引数 \var{run_name} が与えられていればその値が、
そうでなければ \var{mod_name} 引数の値がセットされます。

\code{__loader__} はモジュールのコードを取得するのに使われる PEP 302 のモジュール
ローダがセットされます(このローダは標準のインポート機構に対するラッパーかもしれません)。

\code{__file__} はモジュールローダにより与えられた名前がセットされます。もし
ローダがファイル名情報を取得可能にしなければ、この変数の値は \code{None} に
なります。

\code{__builtins__} は自動的に \module{__builtin__} モジュールのトップレベル
名前空間への参照で初期化されます。

引数 \var{alter_sys} が与えられて \code{True} に評価されるならば、
\code{sys.argv[0]} は \code{__file__} の値で更新され
\code{sys.modules[__name__]} は実行されるモジュールの一時的モジュール
オブジェクトで更新されます。
\code{sys.argv[0]} と \code{sys.modules[__name__]} はどちらも
関数が処理を戻す前にもとの値に復旧します。

この \module{sys} に対する操作はスレッドセーフではないということに注意してください。
他のスレッドは部分的に初期化されたモジュールを見たり、入れ替えられた引数リストを
見たりするかもしれません。この関数をスレッド化されたコードから起動するときは
\module{sys} モジュールには手を触れないことが推奨されます。
\end{funcdesc}

\begin{seealso}

\seepep{338}{Executing modules as scripts}{Nick Coghlan
 によって書かれ実装された PEP}

\end{seealso}
