gpt4 book ai didi

python - 调用 PyEval_CallObject 时程序关闭

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:50 24 4
gpt4 key购买 nike

我正在尝试在 python 脚本中使用 C 模块,因此当代码到达 PyEval_Callobject 调用程序时崩溃/关闭。

C 端代码:

    static PyObject *register_inactivity_callback(PyObject *self, PyObject *args)
{
PyObject *temp;

if (!PyTuple_Check(args) || PyTuple_Size(args) < 0)
{
fprintf(stderr, "invalid input parameter\n");
Py_RETURN_NONE;
}

temp = PyTuple_GetItem(args, 0);
if (!PyCallable_Check(temp))
{
fprintf(stderr, "parameter must be callable\n");
Py_RETURN_FALSE;
}
Py_XINCREF(temp);
Py_XDECREF(inactivity_callback);
inactivity_callback = temp;

Py_RETURN_TRUE;
}

void inactivity_callback_internal(void *arg)
{
PyObject *arglist;
struct input_event *event = (struct input_event *)arg;

if (inactivity_callback && event)
{
arglist = Py_BuildValue("()");
PyEval_CallObject(inactivity_callback, arglist);
Py_DECREF(arglist);
}
}

Python 方面:

def on_inactivity():
print 'inactivity'

register_inactivity_callback(on_inactivity)

我已经在 ubuntu 桌面平台上测试了这段代码及其工作情况,但是当我转移到 ARM 上时,程序开始在 PyEval_CallingObject 上崩溃/关闭。

我在代码中做了什么可疑的事情吗?提前致谢。

最佳答案

我找到了根本原因。 PyEval_CallObject 函数需要被 PyGILState_Ensure/Release 函数包装。参见 http://docs.python.org/2/c-api/init.html (非 Python 创建的线程)。

gstate = PyGILState_Ensure();
PyEval_CallObject(inactivity_callback, arglist);
PyGILState_Release(gstate);

关于python - 调用 PyEval_CallObject 时程序关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15950385/

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