Pythonの拡張モジュール勉強メモ2

Cの関数とPythonをつなげるための準備。
メソッドテーブルを作る。

static PyMethodDef SpamMethods[] = {
    ...
    {"system",  spam_system, METH_VARARGS,
     "Execute a shell command."},
    ...
    {NULL, NULL, 0, NULL}        /* Sentinel */
};

PyMethodDefは

  • 名前
  • C関数へのポインタ
  • どのように呼び出されるか指定するフラグ
  • docstring

METH_VARARGSだと

spam_system(PyObject *self, PyObject *args) {

をexpectしてMETH_KEYWORDSが指定されたときは第3引数に
PyObject *がキーワード用の辞書になってるとか。

こういうメソッドテーブルは初期化関数でインタプリタに渡す。
初期化関数はinitモジュール名(), spamだとinitspam()。

Pythonが初めてimport spamするときにinitspamが呼ばれる。

Py_InitModule()が呼ばれ、モジュールオブジェクトを作り、
そのポインタを呼び出し元に返すという流れ。

もっとしっかりした例はPythonのソースツリーのModules/xxmodule.cにあるので確認しておく。
テンプレートとしても使えます。


ここでようやくコンパイル
distutilsを使う(Python2.Xに同梱されている)

spamモジュールだと次のような感じ

from distutils.core import setup, Extension

module1 = Extension('demo',
                    sources = ['demo.c'])

setup (name = 'PackageName',
       version = '1.0',
       description = 'This is a demo package',
       ext_modules = [module1])

python setup.py build
python setup.py install

これで完了。

distutilsはよく知らないので別途調べる必要あり。

このチュートリアル,はじめのサンプルを動作させるところまでの道のり長過ぎ。