2024-04-23 16:55:47 发布
网友
我想在C应用程序中使用基于事件的Python库。我使用官方C-API嵌入Python:http://docs.python.org/2/c-api/index.html#c-api-index
从C调用方法并收集返回值是没有问题的。但是,我不知道怎么做:
一些python库函数以我认为的python函数指针作为参数。在
当从C调用这些方法时,是否可以传递一个C函数指针,以便Python函数使用C函数作为回调函数?在
如果没有,如何让Python使用C回调呢?在
这比人们预期的要难,但这是可以做到的。在
如果有一个C函数作为回调函数提供,可以使用PyCFunction_New将其转换为Python可调用函数:
PyCFunction_New
#include <python.h> static PyObject *my_callback(PyObject *ignore, PyObject *args) { /* ... */ } static struct PyMethodDef callback_descr = { "function_name", (PyCFunction) my_callback, METH_VARARGS, /* or METH_O, METH_NOARGS, etc. */ NULL }; static PyObject *py_callback; ... py_callback = PyCFunction_New(&callback_descr, NULL);
如果您想在运行时选择不同的回调,例如提供一个将C回调函数转换为Python回调的通用c_to_python函数,那么这种方法就行不通了。在这种情况下,您需要用它自己的tp_call实现一个扩展类型。在
c_to_python
tp_call
这段代码被简单地扩展为也接受user_data指针;只需将用户数据存储在CallbackObject结构中。在
user_data
CallbackObject
这比人们预期的要难,但这是可以做到的。在
如果有一个C函数作为回调函数提供,可以使用
PyCFunction_New
将其转换为Python可调用函数:如果您想在运行时选择不同的回调,例如提供一个将C回调函数转换为Python回调的通用
^{pr2}$c_to_python
函数,那么这种方法就行不通了。在这种情况下,您需要用它自己的tp_call
实现一个扩展类型。在这段代码被简单地扩展为也接受
user_data
指针;只需将用户数据存储在CallbackObject
结构中。在相关问题 更多 >
编程相关推荐