ipython 调试器:如何在交互式 pdb 中获得完整回溯?
我最近把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 个回答
有没有办法让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