我正在把Python解释器嵌入到一个C程序中。但是,当通过PyRun_SimpleString()
运行一些python脚本时,可能会遇到无限循环或执行时间过长。考虑PyRun_SimpleString("while 1: pass");
防止主程序阻塞,我想我可以在线程中运行解释器。
如何在运行在线程中的嵌入式解释器中停止执行python脚本而不杀死整个进程?
是否可以将异常传递给解释器?我应该把剧本包在其他能听信号的剧本下面吗?
注:我可以在一个单独的进程中运行python,但这不是我想要的——除非这是最后的办法。。。
更新:
所以,现在可以了。再次感谢丹尼斯·奥奇达赫!
如果我看对了,您必须做两件事:告诉解释器停止,并且在PyRun_SimpleString()正在运行的同一线程中return -1
。
要停止,有几个可能性:PyErr_SetString(PyExc_keyboardInterrupt, "...")
或PyErr_SetInterrupt()
-第一个可能会让Python运行更多的指令,然后它停止,后面的一个会立即停止执行。
为了return -1
,可以使用Py_AddPendingCall()
将函数调用注入到Python执行中。文档从2.7和3.1版开始就提到了它,但它也运行在早期的Pythons上(这里是2.6)。在2.7和3.1中,它也应该是线程安全的,这意味着您可以在不获取GIL(?)的情况下调用它。
所以我们可以重写下面的例子:
int quit() {
PyErr_SetInterrupt();
return -1;
}
目前没有回答
相关问题 更多 >
编程相关推荐