如何中断C ++应用程序中嵌入的python解释器

时间:2019-01-30 13:21:09

标签: python c++ cpython python-c-api python-embedding

我们有一个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:trace函数

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执行会中断。

1 个答案:

答案 0 :(得分:1)

PyEval_SetTrace仅影响当前线程

您想要PyErr_SetInterrupt。不管调用线程(不需要打扰GIL),它都会中断(Python认为是)主线程