目次

PythonからCの関数を呼び出す

作成日: 2023-08-03 (木)

第2回 Python/C APIに触れてみる

ソースコード

setup.py

from setuptools import setup, Extension

setup(
    name="toymath",
    ext_modules=[
        Extension("toymath", ["toymathmodule.c"]),
    ]
)

toymathmodule.c

#define PY_SSIZE_T_CLEAN
#include <Python.h>

// 利用したいCの関数
static int add(int a, int b) {
    return a + b;
}

// addをラップした関数
static PyObject *toymath_add(PyObject *self, PyObject *args) {
    int a, b;
    if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
        return NULL;
    }

    int ret = add(a, b);
    return PyLong_FromLong(ret);
}

// 公開する関数の情報
static PyMethodDef toymath_methods[] = {
    {"add", toymath_add, METH_VARARGS, "Add integer values."},
    {NULL, NULL, 0, NULL},
};

// モジュールの情報
static PyModuleDef toymath_module = {
    PyModuleDef_HEAD_INIT,
    "toymath",
    "Toy mathematic functions.",
    -1,
    toymath_methods
};

// モジュールの初期化
// impoortされたときに呼び出される
// PyInit_xxxのxxxの部分は、モジュール名と一致させる
PyMODINIT_FUNC PyInit_toymath(void) {
    return PyModule_Create(&toymath_module);
}