2014-01-18 46 views
0

我目前正在运行一个程序,我希望这个程序可以持续一两个小时。我现在需要跳出循环,这样程序的其余部分才会继续。如何在执行时停止for循环

这是代码的一部分:

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。我想退出并继续使用代码(此处未显示)。请建议我如何使程序不会完全退出。 (不喜欢键盘中断)

+1

运行这个控制台并在后台模式? – thefourtheye

+0

它已经在控制台中运行,无法停止程序。我可以改变模式吗? – user3185551

+0

* nix版本:'nohup python script.py> output.txt&' – thefourtheye

回答

3

我想你也可以把for循环放在try块中,并通过继续执行程序的其余部分来捕获keyBoardInterrupt异常。采用这种方法,您应该能够在程序内部按住ctrl + C的同时跳出循环。代码看起来类似于:

try: 

    # your for loop 

except KeyboardInterrupt: 

    print "interrupted" 

# rest of your program 
2

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

4

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

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

实际上,你只需要决定,如果你要么离开它单独完成,或杀死它,并重新启动。

简单地杀死进程,修改代码以使循环可以中断(如@fedorSmirnov建议的),并且使用KeyboardInterrupt异常,然后重新开始可能是最容易的。您将失去已投入的处理时间,但将其视为沉没成本。

这里有上很多有用的信息如何支持添加到您的程序进行调试运行过程: