1.4 Pythonの組み込み

(拡張モジュールを書く人とは対照的に) Pythonインタープリタを組み込む人だけが心配する必要がある 1つの重要な仕事はPythonインタープリタの初期化、そしてあるいは 終了処理である。インタープリタのたいていの機能は インタープリタが初期化されてからしか使うことができない。

基本的な初期化関数は Py_Initialize()である。 これは読み込まれたモジュールの表を初期化して、 基本的なモジュール __builtin____main__sysを作り出す。 それはまたモジュールの検索パス(sys.path) を初期化する。

Py_Initialize()は``スクリプトの引数リスト'' (sys.argv)を設定しない。もしこの変数が後で実行される Pythonのコードで必要とされるのであれば、それは Py_Initialize()の呼び出しに続けて PySys_SetArgv(argc, argv) への呼び出しで明示的に設定されなければならない。

たいていのシステムでは(詳細はやや異なるが、特にUnixとWindowsでは)、 Py_Initialize()は、 PythonライブラリがPythonインタープリタの実行形式に相対的な 決まった場所で見つかると仮定して、 標準のPythonインタープリタの実行形式の場所をできる限り推測して、 それに基いた モジュールの検索パスを計算する。 特に、pythonという名前の実行形式がシェルのコマンド検索 パス(環境変数$PATH)上で見つかったディレクトリの 親ディレクトリに相対的な lib/python1.5(1.5を現在のインタープリタのバージョン に置き換えて)という名前のディレクトリを探す。

例えば、もしPythonの実行形式が/usr/local/bin/pythonで 見つかれば、それは/usr/local/lib/python1.5にライブラリが あると仮定する(事実、この特別なパスはまた``フォールバック''の 場所で、Pythonという名前の実行形式ファイルが$PATH上に 見つからないときに使われる)。 ユーザはこの振舞いを環境変数$PYTHONHOMEを設定することで 上書きできるか、または$PYTHONPATHを設定して標準のパスの前に 追加のディレクトリを挿入することができる。

組み込みのアプリケーションは Py_Initialize()を呼ぶ前に Py_SetProgramName(file)を 呼ぶことで検索を操ることができる。 $PYTHONHOMEがなおこれを上書きすることと、 $PYTHONPATHがなお標準のパスの前に挿入されることに注意せよ。 完全に制御する必要があるアプリケーションは、 Py_GetPath(), Py_GetPrefix(), Py_GetExecPrefix()Py_GetProgramFullPath() (全てModules/getpath.cで定義されている) のそれ自身の実装を提供する必要がある。

時々、Pythonを初期化しない状態にすることが望ましい。 例えば、アプリケーションが最初からやり直したい (Py_Initialize()をもう一度呼ぶ)かもしれないし、 または単にPythonを使い終えてPythonによって割り当てられた 全てのメモリを解放したい、などだ。 これはPy_Finalize()を呼ぶことで達成できる。 関数Py_IsInitialized()は もしPythonが現在初期化された状態であれば真を返す。 これらの関数についてのさらなる情報は後の章で与えられる。