如何中断嵌入在 C++ 应用程序中的 python 解释器
How to interrupt python interpreter embedded in C++ application
我们有一个 C++ QT 应用程序,我们在其中嵌入了 python。
我们为用户提供了两个接口
1.执行文件
2.停止执行。
我们使用 PyRun_FileExFlags 在非 GUI 线程中执行 python 文件。
我们想中断 python 文件执行(假设 python 文件有一个无限循环,它永远不会完成执行)。
如何中断?
我们试过以下
1. 在主线程中使用 PyEval_SetTrace 设置跟踪
2.(如果用户点击停止执行)在跟踪回调函数中我们设置错误"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)。
我们有一个 C++ QT 应用程序,我们在其中嵌入了 python。 我们为用户提供了两个接口 1.执行文件 2.停止执行。 我们使用 PyRun_FileExFlags 在非 GUI 线程中执行 python 文件。 我们想中断 python 文件执行(假设 python 文件有一个无限循环,它永远不会完成执行)。 如何中断?
我们试过以下 1. 在主线程中使用 PyEval_SetTrace 设置跟踪 2.(如果用户点击停止执行)在跟踪回调函数中我们设置错误"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)。