差分
このページの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(& | ||
| + | } | ||
| + | </ | ||
