我将 Python 解释器嵌入到 C 程序中。但是,在运行某些 python 脚本时,可能PyRun_SimpleString()
会遇到无限循环或执行时间过长的情况。考虑PyRun_SimpleString("while 1: pass");
在防止主程序阻塞时,我认为我可以在线程中运行解释器。
如何停止在线程中运行的嵌入式解释器中执行 python 脚本而不杀死整个进程?
是否可以将异常传递给解释器?我应该将脚本包装在其他会监听信号的脚本下吗?
PS:我可以在一个单独的进程中运行 python 但这不是我想要的——除非它是最后的手段......
更新:
所以,它现在有效。再次感谢 Denis Otkidach!
如果我没看错,您必须做两件事:告诉解释器停止并return -1
在 PyRun_SimpleString() 运行的同一线程中。
要停止,有几种可能性:PyErr_SetString(PyExc_KeyboardInterrupt, "...")
或者PyErr_SetInterrupt()
- 第一个可能让 Python 运行更多指令然后它停止,后一个立即停止执行。
return -1
用于将Py_AddPendingCall()
函数调用注入 Python 执行。文档从 2.7 和 3.1 版本开始提到它,但它也可以在早期的 Python 上运行(此处为 2.6)。从 2.7 和 3.1 开始,它也应该是线程安全的,这意味着您可以在不获取 GIL (?) 的情况下调用它。
所以可以重写下面的例子:
int quit() {
PyErr_SetInterrupt();
return -1;
}