我正在用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
,它怎么会消失?
答案 0 :(得分:1)
问题不在于绑定方法的self
对象被破坏了,而是你试图在不保持GIL的情况下调用Python函数。
这通常是在编写在异步回调期间执行代码的C扩展时要检查的第一件事。你永远不知道CoreFoundation(或其他什么)什么时候打电话给你......