gpt4 book ai didi

python - 停止嵌入式 Python

转载 作者:IT老高 更新时间:2023-10-28 20:29:13 29 4
gpt4 key购买 nike

我正在将 Python 解释器嵌入到 C 程序中。但是,通过 PyRun_SimpleString() 运行某些 python 脚本时,可能会遇到无限循环或执行时间过长。考虑 PyRun_SimpleString("while 1: pass"); 在防止主程序阻塞时,我认为我可以在线程中运行解释器。

如何停止在线程中运行的嵌入式解释器中执行 python 脚本而不杀死整个进程?

是否可以将异常传递给解释器?我应该将脚本包装在其他可以监听信号的脚本下吗?

PS:我可以在单独的进程中运行 python,但这不是我想要的 - 除非它是最后的手段......


更新:

所以,它现在可以工作了。再次感谢 Denis Otkidach!

如果我没看错,你必须做两件事:告诉解释器停止并在 PyRun_SimpleString() 运行的同一线程中 return -1

要停止,有几种可能性:PyErr_SetString(PyExc_KeyboardInterrupt, "...")PyErr_SetInterrupt() - 第一个可能会让 Python 运行一些更多指令然后它停止,后面的指令立即停止执行。

return -1 使用Py_AddPendingCall() 将函数调用注入(inject)Python 执行。文档从 2.7 和 3.1 版本开始提到它,但它也可以在早期的 Python 上运行(此处为 2.6)。从 2.7 和 3.1 开始,它也应该是线程安全的,这意味着您可以在不获取 GIL (?) 的情况下调用它。

所以可以重写下面的例子:

int quit() {
PyErr_SetInterrupt();
return -1;
}

最佳答案

您可以使用 Py_AddPendingCall() 添加一个函数引发异常,以便在下一次检查间隔时调用(有关详细信息,请参阅 sys.setcheckinterval() 上的文档)。这是一个带有 Py_Exit() 调用的示例(这对我有用,但可能不是您需要的),将其替换为 Py_Finalize() 之一>PyErr_Set*():

int quit(void *) {
Py_Exit(0);
}


PyGILState_STATE state = PyGILState_Ensure();
Py_AddPendingCall(&quit, NULL);
PyGILState_Release(state);

这对于任何纯 python 代码来说都足够了。但请注意,一些 C 函数可以作为单个操作运行一段时间(有一个长时间运行正则表达式搜索的示例,但我不确定它是否仍然相关)。

关于python - 停止嵌入式 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420957/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com