在Shell中中断Python脚本并进入解释器,保留状态

0 投票
3 回答
709 浏览
提问于 2025-04-18 16:13

我知道有一些方法可以写一个Python脚本,这样在终端执行时,你可以进入解释器,并且变量的状态会被保留。

那么,是否可以在Python脚本执行到一半的时候中断它,然后进入解释器,并保留当时的状态呢?举个例子,我有一个很大的循环,每次循环都会往一个字典里添加一个新的键值对。循环结束时,这个字典会被写入一个文件。如果我运行这个脚本几个小时后,发现让它继续运行没什么意义,但我还是想看看到目前为止字典的内容。

现在这个脚本正在我的终端中运行,有没有办法从这里跳到解释器,查看字典的当前状态呢?

编辑:在运行脚本后进入解释器(状态被保留)

python -i script.py

3 个回答

-1

不,你不能这样做。如果你想从一个特定的状态重新开始你的脚本,你必须保存这个状态,并在脚本重新执行时加载它。在你的情况下,可以使用一个临时文件来保存计算出来的值,以及另一个文件来控制流程。别忘了在成功后删除这个文件。

0

如果你已经在运行一个程序,不能简单地把它放到交互式控制台里。

不过,你可以尝试用 gdb 连接到正在运行的进程,具体可以参考这个链接:https://wiki.python.org/moin/DebuggingWithGdb

$ gdb python <pid of running process>

然后你可以像调试 C 语言程序那样去调试它。

另外,你也可以看看这个链接,了解更多关于如何把控制台连接到正在运行的进程的信息:python: is it possible to attach a console into a running process

0

这里有一个稍微不太干净的解决办法,使用了try except和raw_input(适用于python 2.7)。这样做虽然不能让你进入解释器,但你可以通过按ctrl+c来暂停脚本,并打印出需要的变量,以便了解它的状态。

import time

t = 0

while 1:
    try:
        print time.time()
        time.sleep(5)
        t += 1
    except KeyboardInterrupt:
        print '\nt = {}'.format(t)
        # time.sleep(5)
        raw_input("Script paused! Enter anything to continue or press Ctrl+C to stop execution.")

你甚至可以在except块里调用pdb:

import pdb
pdb.set_trace()

这样就可以进入调试器,在那里你可以使用python控制台。

撰写回答