ここまでは、埋め込み 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 に公開することになります。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。