[英]Crash in PyObject_Call
我正在用C语言编写本机Python模块,而对PyObject_Call
调用崩溃了。 目标是对象的实例方法,该方法已传递给本机对象的构造函数。
我的自定义对象类型的构造函数如下所示:
static int InitMyThing(EventTapObject *self, PyObject *args, PyObject *kwds) {
char *kwlist[] = { "callback", NULL };
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O", kwlist, &self->callback)) {
return -1;
}
Py_INCREF(self->callback);
...
return 0;
}
稍后,响应OS事件(特别是OS X CGEventTap),我调用PyObject_CallObject(self->callback, NULL)
。 反过来,这将调用PyObject_Call
,从而崩溃。
我尝试直接调用PyObject_Call
(按照规定使用一个空的元组),并且与PyObject_Print
一样,发生相同的崩溃。
同时,我的本机对象不会被删除(至少不会调用析构函数),拥有回调方法的Python对象也不会被删除。
因此,如果我在回调中调用Py_INCREF
,它怎么会消失呢?
问题不在于绑定方法的self
对象被破坏,而是您试图在不持有GIL的情况下调用Python函数。
通常,这是编写在异步回调期间执行代码的C扩展时要检查的第一件事。 您永远不知道CoreFoundation(或其他任何东西)何时会打电话给您……
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.