【问题标题】:ipython debugger: full traceback on interactive pdb?ipython 调试器:交互式 pdb 的完整回溯?
【发布时间】:2011-11-03 00:04:19
【问题描述】:

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

我希望看到 ZeroDivisionError 之前 q'ing 退出 pdb。

【问题讨论】:

  • 这是 IPython 0.11 中的一个错误 - 在您离开调试器之后打印回溯,而不是在它启动之前。它将被修复为 0.12(应该在圣诞节前发布)。

标签: python ipython pdb ipdb


【解决方案1】:

有没有办法让 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 选项设置为Plain 来启动ipython

来自IPython reference

$ ipython [options] files

--xmode=<modename>

异常报告模式。

有效模式:Plain、Context 和 Verbose。

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

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

详细:类似于 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

Using the Python debugger.

【讨论】:

  • 消息的第二部分 (--xmode) 似乎是答案,但它似乎不起作用。我已经尝试了所有 3 个模式名,并且回溯看起来都一样。知道是什么原因造成的吗?
  • 谢谢。不幸的是,这指出了(我的副本?)ipython 中可能存在的错误:$ ipython --xmode=Plain WARNING: Unrecognized alias: 'xmode', it will probably have no effect. 但是,一旦在 ipython 中:In [1]: %xmode Exception reporting mode: Plain 工作正常
  • 我明白了。您可能需要构建一个干净的 ipython 副本(或使用 easy_install/pip 重新安装)。作为一种解决方法,您可以将 %mode ... 行作为初始化命令添加到 ~/.ipython/ 配置文件并解决问题(希望如此)!
猜你喜欢
  • 2017-03-22
  • 1970-01-01
  • 2013-01-16
  • 2013-04-10
  • 2012-10-21
  • 2012-10-24
  • 2013-09-19
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多