首页 > 解决方案 > 如果我键盘中断一个正在运行的 Python 脚本,有没有办法从它停止的地方重新开始?(视窗)

问题描述

我在工作中有一个长时间运行的脚本(不幸的是 Windows),如果我 ctrl-c,我在其中对其进行了编程以打印当前的分析结果。但是,我很好奇在执行 ctrl-c 之后,是否可以从停止的地方重新开始运行脚本?

这实际上是 3 个问题: - 是否可以在没有任何编程更改的情况下做到这一点?- 例如,我不小心按了 ctrl-c 并想在它停止的地方追溯启动它 - 我可以在 windows 上使用 ctrl-z 之类的命令(我相信仅在 Mac 上)并编写脚本以在我发出结果时打印结果吗?- 当我使用中断命令、存储该行号(可能在文件中)并在下一行与下一次执行?

谢谢!

(仅供参考:我是 Python 新手,我的脚本目前大约需要 10 分钟才能执行 100 万行。我将来使用的文件通常会有 100+ 百万行)

标签: pythonpython-3.x

解决方案


第一个问题的简短回答是不。Ctrl-C 向解释器发出信号,解释器展开堆栈,向您显示堆栈跟踪,然后停止。您无法从 ctrl-C 中恢复,原因与您无法从任何其他未捕获的异常中恢复相同。您所要求的是将 Humpty Dumpty 重新组合在一起的快速方法。

您可以在任何时候重新开始下棋游戏,只需根据您在放弃游戏之前制作的图片布置棋子即可。但是你不能用一个程序轻易地做到这一点。问题在于,知道程序停止的行号并不足以重新创建当时的程序状态:所有变量的值、堆栈的状态、已读取的输入量、等等。换句话说,画面很复杂,准确地布置这些碎片是很困难的。

如果您的程序正在写入 Windows 控制台,您可以按 ctrl-S 暂停输出,然后按 ctrl-Q 重新启​​动它。这些控制字符是电传打字机时代的遗留物,但现代终端仿真器仍然服从它们。这是一种无需更改程序即可快速完成所需操作的方法。不复杂,但可能足以开始。

如果您的程序将其输出写入文件,以便稍后在文本编辑器中检查,而不是直接写入 Windows 控制台,您的程序可能会运行得更快。

对于您的问题,我会毫不犹豫地向新手推荐一个全面的解决方案。这个想法是将计算和显示分成两个过程。计算过程做它的事情并将其结果逐行提供给显示过程。显示进程监听计算进程并将其得到的结果显示在屏幕上,但也可以接受暂停和恢复命令。当它处于暂停状态时会发生什么是设计决策。您可以决定计算过程应该阻塞(更简单的选项),或者它应该缓冲其结果,直到显示过程准备好再次接受它们(更难的选项)。


推荐阅读