#
4 Python の埋め込み

Python インタプリタの埋め込みを行う人 (いわば拡張モジュールの 書き手の対極) が気にかけなければならない重要なタスクは、 Python インタプリタの初期化処理 (initialization)、そしておそらくは 終了処理 (finalization) です。インタプリタのほとんどの機能は、 インタプリタの起動後しか使えません。

基本的な初期化処理を行う関数は `Py_Initialize()` です。 この関数はロード済みのモジュールからなるテーブルを作成し、 土台となるモジュール `__builtin__`, `__main__`, `sys`, および `exceptions` を作成します。 また、モジュール検索パス (`sys.path`) の初期化も行います。

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

ほとんどのシステムでは (特に Unix と Windows は、詳細がわずかに 異なりはしますが)、 `Py_Initialize()` は 標準の Python インタプリタ実行形式の場所に対する推定結果に基づいて、 Python のライブラリが Python インタプリタ実行形式からの相対パスで 見つかるという仮定の下にモジュール検索パスを計算します。 とりわけこの検索では、シェルコマンド検索パス (環境変数 PATH) 上に見つかった python という名前の実行ファイルの置かれている ディレクトリの親ディレクトリからの相対で、 lib/python2.5 という名前のディレクトリを探します。

例えば、 Python 実行形式が /usr/local/bin/python で見つかった とすると、`Py_Initialize()` はライブラリが /usr/local/lib/python2.5 にあるものと仮定します。 (実際には、このパスは ``フォールバック (fallback)'' のライブラリ 位置でもあり、python が PATH 上にない場合に使われます。) ユーザは PYTHONHOME を設定することでこの動作をオーバライド したり、PYTHONPATH を設定して追加のディレクトリを 標準モジュール検索パスの前に挿入したりできます。

埋め込みを行うアプリケーションでは、 `Py_Initialize()` を呼び出す 前に `Py_SetProgramName(file)` を呼び出すことで、上記の検索を操作できます。 この埋め込みアプリケーションでの設定は依然として PYTHONHOME でオーバライドでき、標準のモジュール検索パスの前には以前として PYTHONPATH が挿入されるので注意してください。 アプリケーションでモジュール検索パスを完全に制御したいのなら、 独自に `Py_GetPath()`, `Py_GetPrefix()`, `Py_GetExecPrefix()`, および `Py_GetProgramFullPath()` の実装を提供しなければなりません (これらは全て Modules/getpath.c で定義されています)。

たまに、 Python を ``初期化しない'' ようにしたいことがあります。 例えば、あるアプリケーションでは実行を最初からやりなおし (start over) させる (`Py_Initialize()` をもう一度呼び出させる) ように したいかもしれません。あるいは、アプリケーションが Python を一旦 使い終えて、Python が確保したメモリを解放できるようにしたいかも しれません。`Py_Finalize()` を使うと、こうした処理を 実現できます。また、関数 `Py_IsInitialized()` は、Python が現在初期化済みの状態にある場合に真を返します。 これらの関数についてのさらなる情報は、後の章で説明します。 `Py_Finalize` がPythonインタプリタに確保された全てのメモリを 開放するわけではないことに注意してください。例えば、格調モジュールに よって確保されたメモリは、現在のところ開放する事ができません。