c中调用python还不简单啊,既然python能调用c,并且把参数以PyObject类型传入到c,你想想python函数在python里面是什么类型,当然也是PyObject,万事万物皆PyObject,既然如此,你完全可以把函数作为PyObject传递给c嘛。为了凑点字数,下面搞点代码,若有人觉得眼熟,请当作没看见。
首先定义一个PyObject类型的指针,一会儿会让这个指针指向你的Python函数
static PyObject *my_callback = NULL;
然后定义一个返回PyObjec指针的函数,函数名随便,这个函数和python通信,所以第二个参数是你传递进来的python参数,然后用PyArg_ParseTuple解析参数,为了检验这个参数是不是函数,还需要进行PyCallable_Check的检查,看看是不是可调用的,如果不是,则报错,如果是则把函数传给my_callback。具体如下
PyObject *temp;
if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
if (!PyCallable_Check(temp)) {
PyErr_SetString(PyExc_TypeError, "parameter must be callable");
return NULL;
}
Py_XINCREF(temp); /* 给temp引用计数加1 */
Py_XDECREF(my_callback); /* 给my_callback引用计数减1 */
my_callback = temp;
}
接着就调用PyObject_CallObject回调my_callback引用的python函数,回调的参数需要用Py_BuildValue处理下,直接传c的类型可不行
int arg;
PyObject *arglist;
PyObject *result;
arg = 123;
arglist = Py_BuildValue("(i)", arg);
result = PyObject_CallObject(my_callback, arglist);
Py_DECREF(arglist);
大功告成,详细请看python官方文档吧