チュートリアルのC や C++ による Python の拡張 の前半を写経した。
Cythonの勉強しようかと思っていたけど、上の方法のブログ記事がたまたま出てきたのでやってみた感じです。
そこまで難しくなさそうという印象です。まだAPIとか何もわかっていませんが。。
本当にチュートリアルのまま spammodule.cをカキカキ。
コメントもチュートリアルの本文そのまま貼っつけ。
spammodule.c
#include <Python.h>
static PyObject *
spam_system(PyObject *self, PyObject *args)
{
const char *command;
int sts;
if (!PyArg_ParseTuple(args, "s", &command))
/*Python の文字列または Unicode オブジェクトを、キャラクタ文字列を指す
C のポインタに変換. "s"の意味
*/
return NULL;
sts = system(command);
return Py_BuildValue("i", sts);
/*書式化文字列と任意の数の C の値を引数にとり、新たな Python オブジェクト
を返す. "i"は整数オブジェクトという意味*/
}
static PyMethodDef SpamMethods[] = {
{"system", spam_system, METH_VARARGS,
"説明 Execute a shell command."},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
initspam(void)
{
(void) Py_InitModule("spam", SpamMethods);
}
無事書き終えたらsetup.pyを以下のように作成。
こちらの記事を参考にしました。
setup.py
from distutils.core import setup, Extension
module1 = Extension('spam',
sources = ['spammodule.c'])
setup (name = 'Spam',
version = '1.0',
description = 'This is a spam package',
ext_modules = [module1])
あとはコマンドライン上で
$python setup.py build
(今回は実験なのでinstall はしない)
を実行する。するとカレント直下にbuildというディレクトリができる。
中身は環境によって違うのかと思いますが、spam.soのパスを指定してimportすれば
使えるようです。
私は適当なディレクトリにspam.soごとコピペしました(いいのかな?)
適当なメモでした。