【发布时间】:2011-07-02 17:06:31
【问题描述】:
所以,我想从 C 中调用 Python 回调函数。
在某个时候,函数被发送到 C 并打包成这样的元组
PyObject *userData = Py_BuildValue("Oi",py_callback,some_number);
在那个区域的某个地方,我也是Py_INCREF(py_callback)。
在程序的稍后时间,我想调用该函数
PyObject *py_callback;
int some_number;
PyArg_ParseTuple((PyObject*)userData,"Oi",&py_callback,&some_number); // returns true
PyObject *py_result = PyObject_CallFunctionObjArgs(py_callback,
/* ... */
NULL);
最后一次调用会引发分段错误。你有什么想法,为什么它会做这样的事情?
【问题讨论】:
-
在调试模式下编译,在 GDB 中加载,并获得回溯。
-
在调用 Python 之前,您是否确保持有 GIL?
-
我发现了一个更可能是罪魁祸首的不同问题(请参阅我的答案)。如果这仍然不起作用,docs.python.org/dev/c-api/… 应该为您提供足够的 Google 素材,以寻找一些更容易理解的关于如何处理 CPython 解释器锁的解释。
-
@ncoghlan:你的建议是正确的:这个问题可以通过 GIL 状态来解决。如果您将您的评论表述为一个问题,我将接受它。
标签: python c function callback call