[macOS Catalina 10.15.7]
これまで自作モジュールはPythonで書いてきましたが、高速化が必要な場合にC/C++モジュールで対応するためテストしてみました。
1.C言語モジュールの作成
#include <Python.h>
static PyObject*
hello_world (PyObject *self, PyObject *args) {
printf("Hello_world\n");
Py_RETURN_NONE;
}
// メソッドの定義
static PyMethodDef TestMethods[] = {
{"hello_world", (PyCFunction)hello_world, METH_NOARGS, "test1: hello_world"},
{NULL, NULL, 0, NULL}
};
// モジュールの定義
static struct PyModuleDef testmodule = {
PyModuleDef_HEAD_INIT,
"test",
NULL,
-1,
TestMethods
};
// メソッドの初期化
PyMODINIT_FUNC PyInit_test (void) {
return PyModule_Create(&testmodule);
}
2.setup.pyの作成
from distutils.core import setup, Extension
setup(name='test',
version='1.0',
ext_modules=[Extension('test', ['test.c'])]
)
3.C言語モジュールのビルド
python setup.py build_ext -i
4.C言語モジュールの動作チェック
作成されたtest.cpython-39-darwin.soファイルをあらかじめ用意しておいたc_moduleフォルダへコピーし、以下のコードを実行。
c_moduleフォルダをライブラリとして認識させるため、フォルダ内に空の__init__.pyを置くようにする。
そしてc_moduleフォルダまたはシンボリックリンクをこのコードと同じところに置く。
なお今後のためにc_moduleフォルダを作成しましたが、soファイルをソースコードと同じところに置くだけでも1行目”import test”にて実行可能です。
from c_module import test
test.hello_world()
--------------------------------------------------
出力
--------------------------------------------------
Hello_world