youtube:python-mixing-002
差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン | |||
youtube:python-mixing-002 [2024/02/28 18:26] – 削除 - 外部編集 (不明な日付) 127.0.0.1 | youtube:python-mixing-002 [2024/02/28 18:26] (現在) – ↷ toybox:python-mixing-002 から youtube:python-mixing-002 へページを移動しました。 freemikan | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | ====== PythonからCの関数を呼び出す ====== | ||
+ | |||
+ | 作成日: 2023-08-03 (木) | ||
+ | |||
+ | [[https:// | ||
+ | ===== ソースコード ===== | ||
+ | |||
+ | ==== setup.py ==== | ||
+ | |||
+ | <file python> | ||
+ | from setuptools import setup, Extension | ||
+ | |||
+ | setup( | ||
+ | name=" | ||
+ | ext_modules=[ | ||
+ | Extension(" | ||
+ | ] | ||
+ | ) | ||
+ | </ | ||
+ | |||
+ | ==== toymathmodule.c ==== | ||
+ | |||
+ | <file c> | ||
+ | #define PY_SSIZE_T_CLEAN | ||
+ | #include < | ||
+ | |||
+ | // 利用したい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, | ||
+ | return NULL; | ||
+ | } | ||
+ | |||
+ | int ret = add(a, b); | ||
+ | return PyLong_FromLong(ret); | ||
+ | } | ||
+ | |||
+ | // 公開する関数の情報 | ||
+ | static PyMethodDef toymath_methods[] = { | ||
+ | {" | ||
+ | {NULL, NULL, 0, NULL}, | ||
+ | }; | ||
+ | |||
+ | // モジュールの情報 | ||
+ | static PyModuleDef toymath_module = { | ||
+ | PyModuleDef_HEAD_INIT, | ||
+ | " | ||
+ | "Toy mathematic functions.", | ||
+ | -1, | ||
+ | toymath_methods | ||
+ | }; | ||
+ | |||
+ | // モジュールの初期化 | ||
+ | // impoortされたときに呼び出される | ||
+ | // PyInit_xxxのxxxの部分は、モジュール名と一致させる | ||
+ | PyMODINIT_FUNC PyInit_toymath(void) { | ||
+ | return PyModule_Create(& | ||
+ | } | ||
+ | </ | ||