如何在C++应用程序中嵌入Python解释器并进行中断处理

4
我们有一个C++ QT应用程序,我们将Python嵌入其中。 我们为用户提供了两个界面: 1. 执行文件 2. 停止执行。 我们在非GUI线程中使用PyRun_FileExFlags来执行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执行可以被中断。

1个回答

2

PyEval_SetTrace 仅影响当前线程

您需要使用PyErr_SetInterrupt。它会中断(Python认为的)主线程,而不管调用线程(无需烦恼GIL)。

最初的回答:


谢谢Davis,如何中断执行PyRun_FileExFlags的线程(不是主线程) - srinivas M
@srinivasM:我认为Python不知道比调用Py_Initialize的线程更多——你能安排它是相同的吗? - Davis Herring
谢谢@Davis:它对主线程有效。您能否建议是否有一种方法可以停止其他线程? - srinivas M
@srinivasM:有PyThreadState_SetAsyncExc,但我不知道如何获取它的id参数。 - Davis Herring

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接