Python PyObject_调用中的崩溃

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

我正在用C编写一个本机Python模块,对
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
。但是有些东西调试起来很痛苦,我仍然记得它们…