我在将Python解释器嵌入到C程序中时,通过
如何在不杀死整个进程的情况下停止运行在线程中的Python脚本?
是否可以向解释器传递异常?我应该将脚本包装在监听信号的其他脚本下吗?
PS:我可以在一个单独的进程中运行Python,但这不是我想要的 - 除非这是最后的手段...
更新:
现在它可以工作了。再次感谢Denis Otkidach!
如果我理解得正确,您需要做两件事:在运行PyRun_SimpleString()的同一线程中告诉解释器停止,并返回-1。
要停止,有几种可能性:使用
要返回-1,您可以使用
因此,可以重写下面的示例:
PyRun_SimpleString()
运行某些Python脚本时可能会遇到无限循环或执行时间过长的情况。例如:PyRun_SimpleString("while 1: pass");
为了防止主程序被阻塞,我想在线程中运行解释器。如何在不杀死整个进程的情况下停止运行在线程中的Python脚本?
是否可以向解释器传递异常?我应该将脚本包装在监听信号的其他脚本下吗?
PS:我可以在一个单独的进程中运行Python,但这不是我想要的 - 除非这是最后的手段...
更新:
现在它可以工作了。再次感谢Denis Otkidach!
如果我理解得正确,您需要做两件事:在运行PyRun_SimpleString()的同一线程中告诉解释器停止,并返回-1。
要停止,有几种可能性:使用
PyErr_SetString(PyExc_KeyboardInterrupt, "...")
或PyErr_SetInterrupt()
- 第一个方法可能会让Python运行更多指令然后停止,后者会立即停止执行。要返回-1,您可以使用
Py_AddPendingCall()
将一个函数调用注入到Python执行中。文档从2.7和3.1版本开始提到了它,但在较早的Python版本中(如2.6)也可以运行。从2.7和3.1开始,它还应该是线程安全的,这意味着您可以在不获取GIL的情况下调用它(?)。因此,可以重写下面的示例:
int quit() {
PyErr_SetInterrupt();
return -1;
}
Py_AddPendingCall()
注册哪个函数?PyErr_SetString()
?Py_Exit()
?还是Py_Finalize()
? - Anton L.PyErr_SetString(PyExc_Exception, "Reset!");
而不是Py_Exit(0)
退出了用户的脚本。 - Mark Coniglio