当前位置: 首页 > 面试题库 >

停止嵌入式Python

周枫涟
2023-03-14
问题内容

我将Python解释器嵌入到C程序中。但是,可能会发生以下情况:通过运行某些python脚本时,PyRun_SimpleString()将陷入无限循环或执行时间过长。考虑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;
}

问题答案:

您可以Py_AddPendingCall()用来添加引发下一个检查间隔的函数引发异常(有关sys.setcheckinterval()更多信息,请参阅文档)。这是一个带有Py_Exit()call的示例(确实对我有用,但可能不是您所需要的),将其替换为Py_Finalize()或之一PyErr_Set*()

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


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

对于任何纯python代码而言,这应该足够了。但是请注意,某些C函数可以作为单个操作运行一段时间(有一个示例运行长时间的regexp搜索,但我不确定它是否仍然有用)。



 类似资料:
  • 问题内容: 我正在使用YouTube iframe将视频嵌入到我的网站中。 我在同一页面上有多个视频。 我想使用javascript左右单击按钮来停止所有或其中之一。 可能吗? 更新: 我尝试了 Talvi Watia 所说的话并使用: 我越来越: 问题答案: 您可能需要阅读《Youtube JavaScriptAPI参考》文档。 当您将视频嵌入页面时,您需要传递以下参数: 如果您想停止所有视频按

  • 使用 Ghostscript 9.19、Windows 10 专业版 我正在使用Ghostscript将现有PDF转换为PDF/A-1b。 然而,即使所需的字体已经嵌入到我的原始PDF中,Ghostscript仍在输出PDF/A文件中替换它们。 具体来说:将字体Times-Bold替换为Times New Roman,Bold。将字体Times-Roman替换为Times New Roman。将字

  • 我有一个关于和应用程序间音频的问题。让我解释一下情况: 我有一个像spotify这样的应用程序,它可以在背景中播放音乐 我有一个应用程序可以打开webview()并播放像youtube一样的视频或仅播放声音。 当视频或声音在webview中播放时,背景音乐也会停止

  • 我有时会在pom中看到以下声明。xml。。。 如您所见,sping-boo-starter-web被声明为tomcat-embed-jasper。 是不是sping-boo-starter-web已经有一个嵌入式tomcat了?为什么一些开发人员仍然声明tomcat-embed-jasper以及boot-starter-web?还是有什么原因?

  • 我遇到的问题是,如何发送enter以结束循环?因为系统。在里面read()取第一个数字,如果我再加上2个数字,示例可以是, 条目: 2 3(输入)读2个数字和和 1 2(输入)读2个数字和和 (enter)这里结束循环,因为enter和no数字,并给出了解决方案 出口: 5. 3. 我不知道我以前发过什么

  • 由于限制,我需要在第一次启动时下载一个wav文件。 我将该文件托管在服务器上。 我已经检查过了,我在服务器上有完整的文件,我也验证过了,用管道将audioinputstream输入到一个剪辑中,播放它就会播放完整的音频。 现在我的问题是:如何将完整的流写入一个文件,或者我是否必须这样做,这是一种更简单的方法,可以将wav文件下载到特定的位置