ipython调试器:交互式pdb上的完全回溯?

时间:2011-11-03 00:04:19

标签: python ipython pdb ipdb

我最近从ipython0.10切换到ipython0.11。在ipython0.11中,我只看到python调试器参与时的完整回溯的一小段(即使用%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

我想在 q之前看到ZeroDivisionError 从pdb中出来。

1 个答案:

答案 0 :(得分:6)

  

有没有办法让ipython只显示异常   抓住了,而不是显示它被抓到的代码在哪里?

您可以使用sys.excepthook

import sys

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

sys.excepthook = exc_hook

来自sys module documentation

  

sys.excepthook(type, value, traceback)

     

此函数打印出给定的回溯和异常   sys.stderr。

     

当引发异常并且未被捕获时,解释器会调用   sys.excepthook有三个参数,异常类,异常   实例和回溯对象。在这个交互式会话中   在控制返回到提示之前发生;在Python中   程序会在程序退出之前发生。处理   可以通过分配另一个来定制这种顶级异常   sys.excepthook的三参数函数。

     

sys.__displayhook__
  sys.__excepthook__

     

这些对象包含displayhook和的原始值   在计划开始时除外。他们得救了   displayhook和excepthook可以恢复,以防它们碰巧得到   用破碎的物体代替。


您还可以尝试使用设置为--xmode的{​​{1}}选项启动ipython

来自IPython reference

Plain
     

异常报告模式。

     

有效模式:普通,上下文和详细。

     

普通:类似于python的正常回溯打印。

     

上下文:在回溯中的每一行周围打印5行上下文源代码。

     

详细:与上下文类似,但另外打印当前可见的变量发生异常(缩短   字符串,如果太长)。如果你发生这种情况可能会非常缓慢   拥有一个庞大的数据结构,其字符串表示很复杂   计算。您的计算机可能会在cpu中冻结一段时间   使用率为100%。如果发生这种情况,您可以使用取消回溯   Ctrl-C(可能多次击中它)。

以下是一些示例用法。请注意每个回溯的行数差异:

<强> $ ipython [options] files --xmode=<modename>

--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

没有指定.py文件:

<强> [ 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

--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

Using the Python debugger