[Python] 263 C言語でモジュールを作成

[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

参考サイト