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

kef*_*ich 6 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
Run Code Online (Sandbox Code Playgroud)

我想 q退出pdb 之前看到ZeroDivisionError .

cho*_*own 6

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

你可以使用sys.excepthook:

import sys

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

sys.excepthook = exc_hook
Run Code Online (Sandbox Code Playgroud)

sys模块文档:

sys.excepthook(type, value, traceback)

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

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

sys.__displayhook__
sys.__excepthook__

这些对象包含程序开头的displayhook和excepthook的原始值.它们被保存,以便可以恢复displayhook和excepthook,以防它们碰巧被破碎的物体取代.


您也可以尝试使用--xmode选项设置启动ipythonPlain

来自IPython参考:

$ ipython [options] files

--xmode=<modename>
Run Code Online (Sandbox Code Playgroud)

异常报告模式.

有效模式:Plain,Context和Verbose.

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

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

详细:类似于上下文,但另外打印当前可见的变量,发生异常(如果太长则缩短字符串).如果你碰巧有一个庞大的数据结构,其字符串表示很复杂,那么这可能会非常慢.您的计算机可能会冻结一段时间,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
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

并且没有指定.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
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

--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
Run Code Online (Sandbox Code Playgroud)

使用Python调试器.