这个问题我想了很久,但一直没有找到合适的解决方案。如果我运行一个脚本,遇到一个IndexError, python会打印出错误的行、位置和快速描述,然后退出。是否有可能在遇到错误时自动启动pdb ?我并不反对在文件顶部添加额外的import语句,也不反对添加几行额外的代码。


当前回答

Ipython有一个用于切换这种行为的命令:%pdb。它所做的与您所描述的完全相同,甚至可能更多(通过语法高亮显示和代码补全为您提供更多信息回溯)。这绝对值得一试!

其他回答

Python -m PDB script.py在python2.7中按continue start,它将运行到错误处并在那里中断以进行调试。

这不是调试器,但可能同样有用(?)

我知道我听圭多在某个地方的演讲中提到过这个。

我刚刚检查了python -?,如果您使用-i命令,您可以在脚本停止的地方进行交互。

给定这个脚本:

testlist = [1,2,3,4,5, 0]

prev_i = None
for i in testlist:
    if not prev_i:
        prev_i = i
    else:
        result = prev_i/i

您可以得到这个输出!

PS D:\> python -i debugtest.py
Traceback (most recent call last):
  File "debugtest.py", line 10, in <module>
    result = prev_i/i
ZeroDivisionError: integer division or modulo by zero
>>>
>>>
>>> prev_i
1
>>> i
0
>>>

说实话,我没用过这个,但我应该用,看起来很有用。

你可以在代码中加入这一行:

import pdb ; pdb.set_trace()

更多信息:在任意一行启动python调试器

要让它运行而不需要在开始时输入c,请使用:

python -m pdb -c c <script name>

Pdb有自己的命令行参数:-c c将在执行开始时执行c(continue)命令,程序将不间断地运行,直到出现错误。

Ipdb有一个很好的上下文管理器来实现这种行为,这使得意图在语义上更清晰:

from ipdb import launch_ipdb_on_exception

with launch_ipdb_on_exception():
    ...