4.1 複数のインタプリタ

mod_python を使っている場合,普段 Python でスクリプトを書いたり コマンドライン上で実効する際には使わない,ある Python の機能が使われている ことを知っておく必要があります.この機能は Python を使っては呼び出せず, C 言語 API を介してのみアクセスできます.

Python C API を使うと サブインタプリタ (subinterpreter) を生成できます.サブインタプリタの詳細は Py_NewInterpreter() 関数のドキュメントに書かれています.この議論の中では,各々のサブインタプリタは 独立した名前空間を持っていて,他のサブインタプリタからアクセスできないということ だけ知っておいてもらえば十分です.この機能は,同じApache サーバの下で実行 される別個のプログラムが影響を及ぼし合わないようにする上でとても役立ちます.

サーバの開始時や mod_python の初期化時には, mod_pythonメイン (main) インタプリタと呼ばれるインタプリタを起動 メインインタプリタにはサブインタプリタの辞書が入ります.初期化時にはこの 辞書は空です.サーバはリクエストを受信するごとに,必要に応じてサブインタプリタを 生成し,サブインタプリタへの参照を辞書に記憶します.辞書は文字列をキーにしており, このキーは インタプリタ名 (interpreter name) といいます. インタプリタ名は任意の文字列にできます.メインインタプリタの名前は "main_interpreter" です.その他のインタプリタを名付ける方法は PythonInterp* ディレクティブで制御できます.デフォルトの動作では Apache の仮想サーバ名 (ServerName ディレクティブ) を使って 名前をつけます。すなわち、同じ仮想サーバのスクリプトは同じサブインタプリタで 実行され、異なる仮想サーバで実行されるスクリプトは互いに完全に別個の名前空間 を持つのです。 PythonInterpPerDirectory および PythonInterpPerDirective ディレクティブを使うと、名前づけ規則を変更して、それぞれアクセス中のディレクトリの 絶対パスを使ったり、Python*Handler のあるディレクトリの名前を 使ったりさせられます。 PythonInterpreter を使うと、 名前づけ規則による設定を特定の文字列で上書きできます。

一度作成すると、サブインタプリタはそれ以降のリクエストで再利用されます。 サブインタプリタは Apache のプロセスが死ぬまで破壊されることも終了することも ありません。

現在どんな名前のインタプリタ下で実行中かは、req.interpreter を見れば分かります。

参考:

Python C 言語 API
Python C 言語 API