2011-11-03 74 views
6

我最近從ipython0.10切換到ipython0.11。在ipython0.11中,當python調試器參與(即使用%pdb)時,我只能看到完整回溯的一小段代碼,而在ipython0.10中,我會看到完整的回溯。據我所知,完整的回溯不能直接從pdb命令行訪問 - 您可以通過'u'瀏覽它,但不能直接看到它。ipython調試器:交互式pdb上的完整回溯?

那麼,有什麼方法可以顯示完整的回溯?比如配置參數?

或者,更有用的是,有什麼辦法讓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「荷蘭國際集團走出PDB的。

+1

這是IPython 0中的一個錯誤。11 - 回溯在離開調試器後打印,而不是在開始之前打印。它將被固定爲0.12(這應該在聖誕節之前)。 –

回答

6

有沒有什麼辦法讓ipython只顯示被抓到的 的Exception,而不是顯示它被抓到的代碼中的哪個位置?

你可以使用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和 excepthook的原始值。他們被保存,以便 displayhook和excepthook可以在它們碰巧得到 被破壞的對象取代的情況下被恢復。


您也可以嘗試開始的IPython與--xmode選項設置爲Plain

IPython reference

$ ipython [options] files 

--xmode=<modename> 

模式的異常報告。

有效模式:普通,上下文和詳細。

Plain:類似於python的普通回溯打印。

上下文:在回溯的每一行周圍打印5行上下文源代碼。

放牧:類似於上下文,但另外打印變量當前可見異常發生的位置(縮短其 字符串如果太長)。如果發生 有巨大的數據結構,其字符串表示形式很複雜 來計算,這可能會非常緩慢。您的計算機可能會以100%的速度使用cpu 凍結一段時間。如果發生這種情況,您可以使用Ctrl-C(可能會多次觸碰它)取消跟蹤。

以下是一些示例用法。注意對於每個追逆中的行的區別:

--xmode=Plain

[ 19:55 [email protected] ~/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 [email protected] ~/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 [email protected] ~/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 [email protected] ~/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 [email protected] ~/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 [email protected] ~/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

+0

消息的第二部分(--xmode)看起來像是答案,但似乎不起作用。我已經嘗試了所有3個模式名稱,並且回溯都完全相同。任何想法是什麼造成的? – keflavich

+1

查看我上面的編輯。 – chown

+0

謝謝。不幸的是,這指出了ipython(我的副本)中的一個錯誤:'$ ipython --xmode = Plain 警告:無法識別的別名:'xmode',它可能沒有任何作用。'但是,一旦在ipython :'在[1]中:%xmode 異常報告模式:Plain'正常工作 – keflavich