6

我最近从 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

我想在退出 pdb之前 q查看 ZeroDivisionError 。

4

1 回答 1

6

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

你可以使用sys.excepthook

import sys

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

sys.excepthook = exc_hook

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>

异常报告模式。

有效模式:Plain、Context 和 Verbose。

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

上下文:在回溯中的每一行周围打印 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 调试器

于 2011-11-03T00:12:22.957 回答