我正在实现一个 Python 插件,它是一个更大的 C++ 程序的一部分。该程序的目标是允许用户在 Python 中输入命令的操作。它目前从 C++ 函数接收一个字符串并通过 exec() 函数运行它。然后,用户可以使用 API 来影响更大的 C++ 程序的更改。
我目前正在开发的功能是暂停执行功能。它需要记住它在代码执行中的位置以及任何局部变量的状态,并在满足条件后恢复执行。我对 Python 不是很熟悉,我想请教一些如何实现此功能的建议。我的第一个设计想法:
1) 使用 yield 命令。 这在一开始似乎是个好主意,因为当您使用下一个命令时,它会记住我需要的所有内容,但问题是,据我所知,yield 仅返回到调用堆栈中的上一级。因此,如果用户调用一个函数,它会返回到用户的代码,而不是更大的 C++ 程序。据我所知,没有办法将 yield 命令向上传播到堆栈???
2) 线程 创建一个主 python 线程,为每个命令创建一个线程。该主线程将为执行的每个命令生成一个线程,并在完成时将其终止。如果它需要暂停和重新启动,它可以通过锁队列来实现。
这是我想到的仅有的两个选项。我不确定 yield 函数是否有效或者它的设计目的是什么。我认为 Threading 方法会起作用,但可能会矫枉过正,并且需要很长时间才能开发。我也在 Python 中寻找某种任务模块,但找不到我要找的东西。我想知道是否有人有任何其他建议,因为我对 Python 不是很熟悉。
编辑:如评论中所述,我没有解释脚本“暂停”时需要发生什么。 python插件需要让C++程序继续执行。在我看来,这意味着 A) 如果我们谈论的是单线程方法则返回,或者 B) 向 C++ 发送消息(函数调用?)
编辑 编辑:如前所述,我没有完全解释问题描述。我将发表另一篇文章,更好地说明当前存在的内容、需要发生的事情以及提供一些 sudo 代码。我是 Stack Overflow 的新手,所以如果这不是合适的回复,请告诉我。
最佳答案
无论何时在 Python 中发送信号,执行都会立即暂停,直到正在使用的任何信号处理函数完成执行;在那一点上,执行从它停止的地方继续。我的建议是使用用户定义的信号之一(signal.SIGUSR1
和 signal.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 系统。
关于python - 在 Python 中暂停执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24835212/