停止嵌入式Python

2024-10-01 09:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在把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;
}

Tags: 程序脚本return进程时间passpyrun线程