如何找出Python卡在哪个循环内?

时间:2013-09-22 08:37:34

标签: python

我有一个.py文件,其中包含许多功能。现在我正在调试代码并发现有时程序卡在某处。

如果我将它留在那里并等待超长时间,则会显示错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 9, in generate
  File "<stdin>", line 7, in choosePath
MemoryError

不知道它被卡住了,因为我有几个whilefor循环。有没有简单的方法可以轻易找出 ?我觉得我不愿意再调试一个循环。

1 个答案:

答案 0 :(得分:9)

点击 CTRL-C 并查看回溯。

例如,以下代码将触及一个永无止境的循环:

import time

def foo():
    while True:
        time.sleep(1)

def bar():
    for i in range(10):
        foo()

bar() 

当我打断它时,我看到:

$ bin/python endless_demo.py 
^CTraceback (most recent call last):
  File "test.py", line 11, in <module>
    bar() 
  File "test.py", line 9, in bar
    foo()
  File "test.py", line 5, in foo
    time.sleep(1)
KeyboardInterrupt

回溯在第5行的foo结束。这是我在打断程序时忙碌的地方。追溯还告诉我,第一个bar()被调用,称为foo(),所以我可以看到我们是如何到达那里的。

请注意,如果您有一个 except处理程序,那么这不一定有效;通过try: except:抓取所有例外也会抓住KeyboardInterrupt。始终至少使用except Exception:来防止捕获系统异常。