PyObject_Call崩溃

时间:2014-01-14 23:23:10

标签: python

我正在用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,它怎么会消失?

1 个答案:

答案 0 :(得分:1)

问题不在于绑定方法的self对象被破坏了,而是你试图在不保持GIL的情况下调用Python函数。

这通常是在编写在异步回调期间执行代码的C扩展时要检查的第一件事。你永远不知道CoreFoundation(或其他什么)什么时候打电话给你......