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はよく知らないので別途調べる必要あり。
このチュートリアル,はじめのサンプルを動作させるところまでの道のり長過ぎ。