Python側からリストを渡したときの受け取り方。
// mymod.cpp #include "mymod.hpp" void print_int(PyObject* p); void print_float(PyObject* p); void print_string(PyObject* p); PyObject* list_in_c(PyObject*, PyObject* args) { // 受け取ったリストの内容をlistargsへ入れる PyObject* listargs; if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &listargs)) return NULL; // リストの要素数を取得 int count = PyList_Size(listargs); printf("list item count == %d\n", count); // リストのアイテムを取得 PyObject* val_0 = PyList_GetItem(listargs, 0); PyObject* val_1 = PyList_GetItem(listargs, 1); PyObject* val_2 = PyList_GetItem(listargs, 2); //各要素の型は、PyObject*を _Check 関数にかけて型チェックを行う ////////////////////////////// if ((bool)PyLong_Check(val_0) == true) { print_int(val_0); } else if ((bool)PyFloat_Check(val_0) == true) { print_float(val_0); } else if ((bool)PyUnicode_Check(val_0) == true) { print_string(val_0); } ////////////////////////////// if ((bool)PyLong_Check(val_1) == true) { print_int(val_1); } else if ((bool)PyFloat_Check(val_1) == true) { print_float(val_1); } else if ((bool)PyUnicode_Check(val_1) == true) { print_string(val_1); } ////////////////////////////// if ((bool)PyLong_Check(val_2) == true) { print_int(val_2); } else if ((bool)PyFloat_Check(val_2) == true) { print_float(val_2); } else if ((bool)PyUnicode_Check(val_2) == true) { print_string(val_2); } } void print_int(PyObject* p) { long v = PyLong_AsLong(p); printf("%d\n", v); } void print_float(PyObject* p) { float v = PyFloat_AsDouble(p); printf("%lf\n", v); } void print_string(PyObject* p) { const char* v = PyUnicode_AsUTF8(p); printf("%s\n", v); }
__declspec(dllexport) extern "C" PyObject * list_in_c(PyObject*, PyObject*); // 関数へアクセスする方法一覧 static PyMethodDef method_list[] = { // Pythonで使用する関数名 , C++内で使用する関数名 , 引数の個数に関するフラグ , docstring { "list_function", (PyCFunction)list_in_c, METH_VARARGS , nullptr }, // 配列の最後は全てNULLの要素を入れておく { nullptr, nullptr, 0, nullptr } };
import DLLforPython DLLforPython.list_function([22,"abc",12.3])