繁体   English   中英

PyObject_Call崩溃

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM