Python PyObject_调用中的崩溃
我正在用C编写一个本机Python模块,对Python PyObject_调用中的崩溃,python,Python,我正在用C编写一个本机Python模块,对PyObject\u调用的调用正在崩溃。目标是一个对象的实例方法,它被传递给我的本机对象的构造函数 自定义对象类型的构造函数如下所示: static int InitMyThing(EventTapObject*self、PyObject*args、PyObject*kwds){ char*kwlist[]={“回调”,NULL}; if(!PyArg_ParseTupleAndKeywords(args、kwds、“O”、kwlist和self->ca
PyObject\u调用
的调用正在崩溃。目标是一个对象的实例方法,它被传递给我的本机对象的构造函数
自定义对象类型的构造函数如下所示:
static int InitMyThing(EventTapObject*self、PyObject*args、PyObject*kwds){
char*kwlist[]={“回调”,NULL};
if(!PyArg_ParseTupleAndKeywords(args、kwds、“O”、kwlist和self->callback)){
返回-1;
}
Py_增量(自->回调);
...
返回0;
}
稍后,为了响应OS事件(特别是OS X CGEventTap),我调用PyObject\u CallObject(self->callback,NULL)
。这将依次调用PyObject\u call
,从而崩溃
我尝试直接调用PyObject\u Call
(按照规定,使用空元组),结果与PyObject\u Print
一样崩溃
我的本机对象不会同时被删除(至少不会调用析构函数),拥有回调方法的Python对象也不会被删除
因此,如果我在回调上调用
Py_incremf
,它怎么会消失?问题不在于绑定方法的self
对象被破坏,而是您试图在不持有GIL的情况下调用Python函数
这通常是在编写异步回调期间执行代码的C扩展时要检查的第一件事。你永远不知道CoreFoundation(或其他什么)什么时候会调用你…当你说“我试着直接调用<代码>PyObject\u调用…就像<代码>PyObject\u打印”时,你的意思是你试着在这个函数中执行它们(在这种情况下,你可以排除所有相关的引用计数),或者你以后尝试过这样做(在CF回调中,在这种情况下,refcounting可能是相关的,GIL/threadstate和所有其他内容也可能是相关的)?还有,是什么让你认为问题在于绑定方法的
self
对象被破坏了,而不是其他任何可能出错的东西?只是看起来很有可能,或者一些证据表明了这一点?是的,是GIL。天哪,我对这些本机模块问题已经不熟悉了。你可以将其作为答案发布,然后我会接受的。我也没有练习。我试着用Cython编写所有东西,或者只是使用Python中的ctypes
或cffi
。但是有些东西调试起来很痛苦,我仍然记得它们…