gpt4 book ai didi

python - PyObject_Call 崩溃

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:16 25 4
gpt4 key购买 nike

我正在用 C 语言编写 native Python 模块,并且对 PyObject_Call 的调用崩溃了。目标是对象的实例方法,它被传递给我的 native 对象的构造函数。

我的自定义对象类型的构造函数如下所示:

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 X CGEventTap),我调用 PyObject_CallObject(self->callback, NULL)。这反过来会调用 PyObject_Call,从而崩溃。

我尝试直接调用 PyObject_Call(按照规定使用空元组),并且出现相同的崩溃,PyObject_Print 也是如此。

我的本​​机对象不会同时被删除(至少,析构函数不会被调用),拥有回调方法的 Python 对象也不会被删除。

因此,如果我在回调中调用 Py_INCREF,它怎么会消失?

最佳答案

问题不在于绑定(bind)方法的 self 对象被破坏,而是您尝试在不持有 GIL 的情况下调用 Python 函数。

在编写在异步回调期间执行代码的 C 扩展时,这通常是首先要检查的事情。你永远不知道 CoreFoundation(或其他什么)什么时候会调用你......

关于python - PyObject_Call 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21126176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com