5.4 埋め込まれた Python の拡張

ここまでは、埋め込み 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 に公開することになります。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。