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


当前回答

使用以下模块:

import sys

def info(type, value, tb):
    if hasattr(sys, 'ps1') or not sys.stderr.isatty():
    # we are in interactive mode or we don't have a tty-like
    # device, so we call the default hook
        sys.__excepthook__(type, value, tb)
    else:
        import traceback, pdb
        # we are NOT in interactive mode, print the exception...
        traceback.print_exception(type, value, tb)
        print
        # ...then start the debugger in post-mortem mode.
        # pdb.pm() # deprecated
        pdb.post_mortem(tb) # more "modern"

sys.excepthook = info

将其命名为debug(或任何你喜欢的名字),并将其放在python路径中的某个地方。

现在,在脚本的开头,只需添加一个导入调试。

其他回答

在层次结构中最顶层异常类的构造函数中放置断点,大多数情况下您将看到哪里引发了错误。

设置断点意味着任何您想要的含义:您可以使用IDE或pdb。Set_trace之类的

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

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

我刚刚检查了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
>>>

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

从3.7开始,你可以在你的代码中直接使用关键字breakpoint(不需要任何导入),就像这样:

try:
    ...  # The line that raises an error
except:
    breakpoint()

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

如果您正在使用ipython,启动后键入%pdb

In [1]: %pdb
Automatic pdb calling has been turned ON