C言語でタプルを生成
C言語でタプルを生成してみました。以下はそのメモ
他言語でPythonの拡張を作るには、BoostライブラリやSwigを使う方法など、いくつかあります。
そのなかで、今回はC言語でPythonのタプルを生成します。
方針はタプルを生成するCコードを書き、setup.pyでビルド&インストールスクリプトを書いて実行した後、動作確認をします。
動作はn個のタプルを生成します。
ファイル名 tuple2.c
// tuple2.c #include <Python.h> PyObject* tuple2_make(PyObject* self, PyObject* args) { int len, i; PyTupleObject* ret_tuple; if (!PyArg_ParseTuple(args, "i", &len)) { return NULL; } if(len == 1) { return Py_BuildValue("i", 0); } ret_tuple = PyTuple_New(len); for(i = 0; i < len; i++) { PyTuple_SetItem(ret_tuple, i, Py_BuildValue("i", 0)); } return ret_tuple; } static PyMethodDef tuple2methods[] = { {"make", tuple2_make, METH_VARARGS, "make tuple\n\ make(int) -> tuple"}, {NULL}, }; PyMODINIT_FUNC inittuple2(void) { Py_InitModule("tuple2", tuple2methods); }
ビルドとインストールスクリプト
ファイル名 setup.py
from distutils.core import setup, Extension setup( name = 'tuple2', ext_modules = [ Extension('tuple2module', ['tuple2.c'], library_dirs = [], libraries = [], extra_compile_args = [], extra_link_args = []) ])
ビルドとインストール
$ python setup.py build $ sudo python setup.py install
確認
$ python >>> import tuple2 >>> tuple2.make(0) () >>> tuple2.make(1) 0 >>> tuple2.make(10) (0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
文字列生成やリスト生成に関しては公式ドキュメントを参照すれば簡単にできます。
参考サイト
http://python.matrix.jp/tips/cpp_extension.html
http://owa.as.wakwak.ne.jp/zope/docs/Python/BindingC/
http://www.python.jp/doc/release/api/tupleObjects.html