ipython 调试器:如何在交互式 pdb 中获得完整回溯?

7 投票
1 回答
6726 浏览
提问于 2025-04-17 05:32

我最近把ipython从0.10版本升级到了0.11版本。在ipython0.11中,当使用调试器(也就是用%pdb)时,我只能看到完整错误信息的一小部分,而在ipython0.10中,我可以看到完整的错误信息。根据我的观察,完整的错误信息在pdb命令行中是无法直接查看的——你可以用'u'命令浏览,但不能直接看到。

那么,有没有办法显示完整的错误信息呢?比如说,有没有什么配置参数可以设置?

或者,更有用的是,有没有办法让ipython只显示捕获到的异常,而不是显示代码中捕获异常的位置?

补充说明:举个例子:

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

In [2]: 1/0
> <ipython-input-2-05c9758a9c21>(1)<module>()
     -1 1/0

ipdb> q
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
/Users/adam/<ipython-input-2-05c9758a9c21> in <module>()
----> 1 1/0

ZeroDivisionError: integer division or modulo by zero

我希望在退出pdb之前,能看到ZeroDivisionError的完整信息。

1 个回答

7

有没有办法让ipython只显示捕获到的异常,而不是显示代码中捕获异常的位置呢?

你可以使用 sys.excepthook

import sys

def exc_hook(type, value, traceback):
    print type

sys.excepthook = exc_hook

来自 sys模块文档

sys.excepthook(type, value, traceback)

这个函数会把给定的错误追踪信息和异常打印到系统的错误输出中。

当一个异常被抛出但没有被捕获时,解释器会调用 sys.excepthook,并传入三个参数:异常类型、异常实例和追踪对象。在交互式会话中,这个调用发生在控制权返回到提示符之前;在Python程序中,这个调用发生在程序退出之前。你可以通过给 sys.excepthook 赋值一个新的三参数函数,来自定义这种顶级异常的处理方式。

sys.__displayhook__
sys.__excepthook__

这些对象保存了程序开始时的原始显示钩子和异常钩子的值。它们被保存是为了在被替换成损坏的对象时,可以恢复显示钩子和异常钩子。


你还可以尝试用 --xmode 选项设置为 Plain 启动ipython。

来自 IPython参考文档

$ ipython [options] files

--xmode=<modename>

异常报告的模式。

有效的模式有:Plain、Context 和 Verbose。

Plain:类似于Python正常的错误追踪打印。

Context:在每个追踪行周围打印5行上下文源代码。

Verbose:类似于Context,但额外打印异常发生时当前可见的变量(如果字符串太长,会缩短)。如果你有一个复杂的数据结构,这可能会非常慢,导致你的电脑在一段时间内看起来像是卡住了,CPU使用率达到100%。如果发生这种情况,你可以用Ctrl-C取消追踪(可能需要多按几次)。

这里有一些示例用法。注意每个追踪的行数差异:

--xmode=Plain

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain ipython-debugger-full-traceback-on-interactive-pdb.py 
------------------------------------------------------------
Traceback (most recent call last):
  File "ipython-debugger-full-traceback-on-interactive-pdb.py", line 2, in <module>
    1 / 0
ZeroDivisionError: integer division or modulo by zero

--xmode=Context

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Context ipython-debugger-full-traceback-on-interactive-pdb.py 
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
      1 
----> 2 #!/usr/bin/python
      3 1 / 0
      4 
      5 

ZeroDivisionError: integer division or modulo by zero

--xmode=Verbose

[ 19:54 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose ipython-debugger-full-traceback-on-interactive-pdb.py 
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/ipython-debugger-full-traceback-on-interactive-pdb.py in <module>()
      1 
----> 2 #!/usr/bin/python
      3 1 / 0
      4 
      5 

ZeroDivisionError: integer division or modulo by zero

如果不指定.py文件:

--xmode=Plain

[ 19:55 jon@hozbox ~/SO/python ]$ ipython --xmode=Plain

In [1]: 1 / 0
------------------------------------------------------------
Traceback (most recent call last):
  File "<ipython console>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

--xmode=Context

[ 20:03 jon@hozbox ~/SO/python ]$ ipython --xmode=Context

In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/<ipython console> in <module>()

ZeroDivisionError: integer division or modulo by zero

--xmode=Verbose

[ 20:01 jon@hozbox ~/SO/python ]$ ipython --xmode=Verbose


In [1]: 1 / 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)

/home/jon/SO/python/<ipython console> in <module>()

ZeroDivisionError: integer division or modulo by zero

使用Python调试器

撰写回答