【发布时间】:2010-11-28 02:28:09
【问题描述】:
我正在将 Python 解释器嵌入到 C 程序中。但是,通过PyRun_SimpleString() 运行某些 python 脚本时,可能会遇到无限循环或执行时间过长。考虑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;
}
【问题讨论】:
标签: python process multithreading embedded-language python-c-api