如何在执行时停止for循环

时间:2014-01-18 07:44:58

标签: python python-idle

我目前正在运行一个程序,我预计会持续一两个小时。我现在需要摆脱循环,以便程序的其余部分继续。

这是代码的一部分:

from nltk.corpus import brown
from nltk import word_tokenize, sent_tokenize
from operator import itemgetter

sentences = []
try:
    for i in range(0,55000):
        try:
            sentences.append(brown.sents()[i])
            print i
        except:
            break
except:
    pass 

循环目前约为30,000。我想退出并继续使用代码(此处未显示)。请建议我如何这样,该程序不会完全打破退出。 (不像键盘中断)

3 个答案:

答案 0 :(得分:4)

由于它已在运行,因此无法修改代码。除非你在pdb下调用它,否则你不能闯入Python调试器来改变条件离开循环并继续执行程序的其余部分。所以没有一条正常的途径对你开放。

有一个外部解决方案,需要熟悉Python解释器和运行时。您可以将gdb调试器附加到Python进程(如果您在Windows上,则附加到VisualStudio)。然后当您进入时,检查主线程的堆栈跟踪。您将看到一系列嵌套的PyEval_*调用等等。如果您可以确定循环在堆栈跟踪中的位置,那么请确定循环。然后,您需要找到计数器变量(包含在PyObject中的整数)并将其设置为足够大的值以触发循环结束,然后让该过程继续。不适合胆小的人!更多信息在这里:

实际上,你只需要决定是单独完成,还是杀掉它并重新启动。

最简单的方法是简单地终止进程,修改你的代码以便循环可以中断(如@fedorSmirnov所建议的)KeyboardInterrupt异常,然后重新开始。您将失去已经投入的处理时间,但将其视为沉没成本。

这里有很多关于如何为程序添加支持以调试运行过程的有用信息:

答案 1 :(得分:3)

我认为您还可以将for循环放在try块中,并通过继续执行程序的其余部分来捕获keyBoardInterrupt异常。使用这种方法,您应该能够通过在保持程序内部时按ctrl + C来突破循环。代码看起来与此类似:

try:

    # your for loop

except KeyboardInterrupt:

    print "interrupted"

# rest of your program

答案 2 :(得分:2)

您可以在break命令之前使用pickle保存数据。下次加载数据并继续循环。