在 Python 中暂停执行

Posted

技术标签:

【中文标题】在 Python 中暂停执行【英文标题】:Pause Execution in Python 【发布时间】:2014-07-18 23:32:16 【问题描述】:

我正在实现一个 Python 插件,它是一个更大的 C++ 程序的一部分。该程序的目标是允许用户在 Python 中输入命令的操作。它当前从 C++ 函数接收字符串并通过 exec() 函数运行它。然后,用户可以使用 API 来影响更大的 C++ 程序的更改。

我正在开发的当前功能是暂停执行功能。它需要记住它在代码执行中的位置以及任何局部变量的状态,并在满足条件后恢复执行。我对 Python 不是很熟悉,希望得到一些关于如何实现此功能的建议。我的第一个设计理念:

1) 使用 yield 命令。 一开始这似乎是一个好主意,因为当您使用下一个命令时,它会记住我需要的所有内容,但问题是,据我所知,yield 只会返回到调用堆栈中的上一个级别。因此,如果用户调用一个产生它的函数,它将简单地返回到用户的代码,而不是更大的 C++ 程序。据我所知,没有办法将 yield 命令向上传播???

2) 线程 创建一个主 python 线程,为每个命令创建一个线程。该主线程将为每个执行的命令生成一个线程,并在完成时将其杀死。如果它需要暂停并重新启动,它可以通过锁队列来完成。

这是我想出的仅有的两个选项。我不确定 yield 函数会起作用,或者它的设计目的是什么。我认为 Threading 方法会起作用,但可能有点矫枉过正,并且需要很长时间来开发。我也在寻找某种 Python 中的任务模块,但找不到我想要的东西。我想知道是否有人有任何其他建议,因为我对 Python 不是很熟悉。

编辑:正如 cmets 中所述,我没有解释脚本“暂停”时需要发生什么。 python插件需要允许C++程序继续执行。在我看来,这意味着 A) 如果我们谈论的是单线程方法,则返回,或者 B) 向 C++ 发送消息(函数调用?)

编辑编辑:如前所述,我没有完全解释问题描述。我将发表另一篇文章,更好地说明当前存在的内容、需要发生的事情以及提供一些 sudo 代码。我是 Stack Overflow 的新手,所以如果这不是适当的回复,请告诉我。

【问题讨论】:

我理解个别的话,但我认为你需要用伪代码或其他东西表达你的问题......我不明白你的问题是什么......time.sleep将使python脚本暂停...但我很确定这不是你在这里问的内容 我同意这一点。您需要解释仅让脚本暂停给定时间段无法实现的目标。目前很难准确掌握您想要做什么。 感谢您帮助澄清我需要在问题陈述中包含的内容。 【参考方案1】:

无论何时在 Python 中发送信号,执行都会立即暂停,直到正在使用的任何信号处理函数执行完毕;那时,执行会从中断的地方继续执行。我的建议是使用用户定义的信号之一(signal.SIGUSR1signal.SIGUSR2)。在此处查看signal 文档:

https://docs.python.org/2/library/signal.html

在程序开始时,您将定义一个信号处理函数,如下所示:

def signal_pause(signum, frame):
  if signum == signal.SIGUSR1:
    # Do your pause here - function processing, etc
  else:
    pass

然后在主程序的某处,您将为刚刚创建的那个切换默认信号处理程序:

signal.signal(signal.SIGUSR1, signal_pause)

最后,当你想暂停时,你会像这样发送SIGUSR1 信号:

os.kill(os.getpid(),signal.SIGUSR1)

您的代码将立即暂停,保存其状态,然后前往signal_pause 函数执行您需要执行的任何操作。一旦该函数退出,程序将恢复正常执行。

编辑:这假设您在暂停程序时想要做一些复杂的事情。如果您只想等待几秒钟或要求一些用户输入,有一些更简单的方法(分别为time.sleepinput)。

编辑编辑:假设您使用的是 Unix 系统。

【讨论】:

感谢您的回答!这将是一个理想的解决方案,但该系统部署到多个平台。我想我需要一个无需操作系统调用即可工作的解决方案。 @Brian 啊,好吧。也许套接字连接更适合您?通过套接字向 C++ 发送一条消息,告诉它继续,然后在 Python 脚本继续之前等待回复?我不知道它们有多普遍,但它们几乎是进程间通信的标准。【参考方案2】:

如果您需要与 C 程序进行通信,那么套接字可能是最佳选择。

https://docs.python.org/2/library/socket.html

您的两个程序中的一个作为套接字服务器,另一个作为套接字客户端连接到它。当您希望 C++ 程序继续时,您可以使用socket.send() 来发送一条继续消息。然后,您的 Python 程序将使用socket.recv(),这将导致它等待直到收到来自 C++ 程序的消息。

如果您需要两个程序相互发送信号,这可能是最安全的方法。

【讨论】:

以上是关于在 Python 中暂停执行的主要内容,如果未能解决你的问题,请参考以下文章

播放、打开和暂停从 Python 脚本执行的 VLC 命令行

在Java中,怎么让程序暂停执行,然后按任意键继续执行?

如何让C#程序在执行中暂停一段时间

python程序如何让其暂停

暂停执行,直到从 tkinter 窗口收到用户输入

python解释器:中断并继续