我最近从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中出来。
答案 0 :(得分:6)
有没有办法让ipython只显示异常 抓住了,而不是显示它被抓到的代码在哪里?
您可以使用sys.excepthook
:
import sys
def exc_hook(type, value, traceback):
print type
sys.excepthook = exc_hook
sys.excepthook(type, value, traceback)
此函数打印出给定的回溯和异常 sys.stderr。
当引发异常并且未被捕获时,解释器会调用 sys.excepthook有三个参数,异常类,异常 实例和回溯对象。在这个交互式会话中 在控制返回到提示之前发生;在Python中 程序会在程序退出之前发生。处理 可以通过分配另一个来定制这种顶级异常
sys.excepthook
的三参数函数。
sys.__displayhook__
sys.__excepthook__
这些对象包含displayhook和的原始值 在计划开始时除外。他们得救了 displayhook和excepthook可以恢复,以防它们碰巧得到 用破碎的物体代替。
您还可以尝试使用设置为--xmode
的{{1}}选项启动ipython
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