如何中断嵌入在C应用程序中的python解释器
作者:互联网
我们有一个C QT应用程序,我们在其中嵌入了python.
我们为用户提供了两个接口
1.执行文件
2.停止执行.
我们使用PyRun_FileExFlags在非GUI线程中执行python文件.
我们想中断python文件的执行(假设python文件有一个无限循环,它永远不会完成执行).
怎么打断?
我们试过以下
1.在使用PyEval_SetTrace的主线程集跟踪中
2.(如果用户点击Stop执行)在跟踪回调函数中我们设置错误“PyErr_SetString”
1:设置跟踪功能
PyGILState_STATE state;
state = PyGILState_Ensure();
PyEval_SetTrace(TraceHook, NULL);
PyGILState_Release(state);
2:跟踪功能
int TraceHook(PyObject *obj, PyFrameObject *frame, int what, PyObject *arg)
{
if (b_isInterrupted)
{
PyGILState_STATE state;
state = PyGILState_Ensure();
PyErr_SetString(PyExc_KeyboardInterrupt, "Python Interrupted.");
PyGILState_Release(state);
}
return 0;
}
Python执行不会中断.
我希望python执行能够中断.
解决方法:
PyEval_SetTrace仅影响当前线程.
你想要PyErr_SetInterrupt
.它中断(Python认为是什么)主线程,无论调用线程(不需要打扰GIL).
标签:python,c-2,cpython,python-c-api,python-embedding 来源: https://codeday.me/bug/20190705/1387206.html