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

Posted

技术标签:

【中文标题】如何中断嵌入在 C++ 应用程序中的 python 解释器【英文标题】:How to interrupt python interpreter embedded in C++ application 【发布时间】:2019-06-23 19:01:42 【问题描述】:

我们有一个 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 执行会中断。

【问题讨论】:

【参考方案1】:

PyEval_SetTrace 只影响当前线程

你想要PyErr_SetInterrupt。它会中断(Python 认为的)主线程,而不管调用线程(无需打扰 GIL)。

【讨论】:

谢谢戴维斯,如何中断正在执行 PyRun_FileExFlags 的线程(不是主线程) @srinivasM:我不认为 Python 比 Py_Initialize 知道的线程更多——你能安排它是同一个线程吗? 感谢@Davis:它适用于主线程。您能否建议是否有办法停止其他线程? @srinivasM:有PyThreadState_SetAsyncExc,但我不知道如何获取它的id 参数。

以上是关于如何中断嵌入在 C++ 应用程序中的 python 解释器的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 C++ 中的 Python

在 C++ 中嵌入 Python:解释器在执行过程中的持久性

c++ 中的嵌入式 python 代码 - 导入 python 库时出错

在阻塞 boost c++ 方法中,如何在 Python 中捕获中断信号?

在 Python GUI 中嵌入 C++ 程序

在 C++ 中嵌入 Python。传递接收列表列表的字符串向量