您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

从C ++(或C)回调中调用python方法

从C ++(或C)回调中调用python方法

如果要从C / C ++回调中调用Python函数,则需要做一些事情。首先,当您保存python函数对象时,需要使用以下方法增加引用计数:

Py_INCREF(pFunc)

否则,Python不知道您要保留对象引用,并且它可能会垃圾回收它,从而在您尝试从回调中使用它时导致分段错误

接下来,您需要关注的是调用C / C 回调时正在运行的线程。如果要从另 一个非Python创建的线程(即,在 套接字上接收数据的C / C 线程)中回调,则 在调用任何Python API函数之前获取Python的全局解释器锁(GIL)。否则,程序的行为是不确定的。要获取GIL,请执行以下操作:

void callback() {
    PyGILState_STATE gstate;
    gstate = PyGILState_Ensure();

    // Get args, etc.

    // Call your Python function object
    PyObject * pInstance = PyObject_CallObject(pFunc, args);

    // Do any other needed Python API operations

    // Release the thread. No Python API allowed beyond this point.
    PyGILState_Release(gstate);
}

另外,在扩展模块的init函数中,您应该执行以下操作以确保正确初始化了线程:

// Make sure the GIL has been created since we need to acquire it in our
// callback to safely call into the python application.
if (! PyEval_ThreadsInitialized()) {
    PyEval_InitThreads();
}

否则,当您尝试从非Python线程获取GIL时,可能会导致崩溃和奇怪的行为。

有关更多信息,请参见非Python创建的线程

python 2022/1/1 18:31:29 有198人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶