ここまでは、埋め込み Python インタプリタはアプリケーション本体の 機能にアクセスする手段がありませんでした。 Python API を使うと、埋め込みインタプリタを拡張することで アプリケーション本体へのアクセスを可能にします。 つまり、アプリケーションで提供されているルーチンを使って、 埋め込みインタプリタを拡張するのです。 複雑なことのように思えますが、それほどひどいわけではありません。 さしあたって、アプリケーションが Python インタプリタを起動したと いうことをちょっと忘れてみてください。その代わり、アプリケーションが サブルーチンの集まりで、あたかも普通の Python 拡張モジュールを 書くかのように、Python から各ルーチンにアクセスできるようにする グルー(glue, 糊) コードを書くと考えてください。例えば以下のようにです:
static int numargs=0; /* アプリケーションのコマンドライン引数の個数を返す */ static PyObject* emb_numargs(PyObject *self, PyObject *args) { if(!PyArg_ParseTuple(args, ":numargs")) return NULL; return Py_BuildValue("i", numargs); } static PyMethodDef EmbMethods[] = { {"numargs", emb_numargs, METH_VARARGS, "Return the number of arguments received by the process."}, {NULL, NULL, 0, NULL} };
上のコードを main() 関数のすぐ上に挿入します。 また、以下の二つの文をPy_Initialize() の直後 に挿入します:
numargs = argc; Py_InitModule("emb", EmbMethods);
これら二つの行はnumargs
変数を初期化し、
埋め込み Python インタプリタからemb.numargs() 関数に
アクセスできるようにします。これらの拡張モジュール関数を使うと、
Python スクリプトは
import emb print "Number of arguments", emb.numargs()
のようなことができます。
実際のアプリケーションでは、こうしたメソッドでアプリケーション内の API を Python に公開することになります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。