#
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 に公開することになります。