在Python中暂停执行

1 投票
2 回答
572 浏览
提问于 2025-04-18 13:55

我正在实现一个Python插件,这个插件是一个更大C++程序的一部分。这个程序的目的是让用户可以用Python输入命令的操作。目前,它从C++函数接收一个字符串,然后通过exec()函数执行这个字符串。用户可以使用一个API来对更大的C++程序进行修改。

我现在正在开发的功能是暂停执行的功能。这个功能需要记住代码执行到哪里了,以及任何局部变量的状态,并在满足某个条件后恢复执行。我对Python不是很熟悉,所以想请教一下如何实现这个功能。我的初步设计想法是:

1) 使用yield命令。 一开始我觉得这个主意不错,因为使用next命令时,它能记住我需要的一切,但问题是,yield似乎只能返回到调用栈的上一个层级。也就是说,如果用户调用了一个yield的函数,它只会返回到用户的代码,而不是更大的C++程序。根据我的理解,似乎没有办法把yield命令向上传播到调用栈中???

2) 线程 创建一个主Python线程,为每个命令创建一个线程。这个主线程会为每个执行的命令生成一个线程,并在完成后结束它。如果需要暂停和重新启动,可以通过一个锁的队列来实现。

这就是我想到的两个选项。我不确定yield函数是否有效,或者它是否就是为了这个目的设计的。我觉得线程的方法可能可行,但可能有点过于复杂,而且开发时间也会很长。我还在寻找Python中的某种任务模块,但没有找到我想要的东西。我在想是否还有其他建议,因为我对Python不是很熟悉。

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

再次编辑:如前所述,我没有完全解释问题的描述。我会再发一篇帖子,详细说明目前的情况和需要发生的事情,并提供一些伪代码。我是Stack Overflow的新手,如果这不是合适的回复,请告诉我。

2 个回答

2

在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.sleep或者input

再补充一下:这假设你是在Unix系统上。

0

如果你需要和一个C程序进行交流,那么使用套接字(sockets)可能是最好的选择。

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

在这两个程序中,一个充当套接字服务器,另一个则作为套接字客户端来连接它。当你想让C++程序继续运行时,可以用 socket.send() 发送一个继续的消息。然后你的Python程序会使用 socket.recv(),这会让它一直等待,直到收到来自C++程序的消息。

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

撰写回答