2009-08-06 47 views
6

從Python文檔:如何設置sys.excepthook在Python中全局調用pdb?

sys.excepthook(type, value, traceback)

此函數打印出一個給定的追蹤和異常sys.stderr

當引發異常並未被捕獲時,解釋器將調用sys.excepthook,其中包含三個參數,即異常類,異常實例和回溯對象。在交互式會話中,這恰好在控制返回提示之前發生;在一個Python程序中,這個就在程序退出之前發生。可以通過向sys.excepthook分配另一個三參數函數來自定義這些頂級異常的處理。

http://docs.python.org/library/sys.html

如何在全球範圍修改此所以默認行爲是始終調用pdb?是否有可以更改的配置文件?我不想包裝我的代碼來做到這一點。

回答

17

這裏就是你需要

http://ynniv.com/blog/2007/11/debugging-python.html

三種方式,第一種是簡單的,但原油(Thomas Heller) - 以下內容添加到站點包/ sitecustomize.py:

import pdb, sys, traceback 
def info(type, value, tb): 
    traceback.print_exception(type, value, tb) 
    pdb.pm() 
sys.excepthook = info 

的其次是更復雜,並檢查交互模式(奇怪地跳過交互模式下的調試),從cookbook

# code snippet, to be included in 'sitecustomize.py' 
import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty(): 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

而第三個通過(總是啓動調試器,除非標準輸入或標準錯誤都被重定向)ynniv

# code snippet, to be included in 'sitecustomize.py' 
import sys 

def info(type, value, tb): 
    if (#hasattr(sys, "ps1") or 
     not sys.stderr.isatty() or 
     not sys.stdin.isatty()): 
     # stdin or stderr is redirected, just do the normal thing 
     original_hook(type, value, tb) 
    else: 
     # a terminal is attached and stderr is not redirected, debug 
     import traceback, pdb 
     traceback.print_exception(type, value, tb) 
     print 
     pdb.pm() 
     #traceback.print_stack() 

original_hook = sys.excepthook 
if sys.excepthook == sys.__excepthook__: 
    # if someone already patched excepthook, let them win 
    sys.excepthook = info 
+0

正是我想要的,謝謝。 – saffsd 2009-08-06 07:52:20

0

嘗試:

import pdb 
import sys 

def excepthook(type, value, traceback): 
    pdb.post_mortem(traceback) 

excepthook.old = sys.excepthook 
sys.excepthook = excepthook 

def raise_exception(): 
    raise_exception() 

raise_exception() 
+1

我不認爲命名pdb調用者'excepthook'是明智的。 – 2009-08-06 07:37:35

1

另一種選擇是使用IPython的,我認爲一個無論如何,任何python開發者都必須擁有這個工具。不要從shell運行你的腳本,而是使用%run從ipython運行它。發生異常時,可以輸入%debug來調試它。 (還有一個選項可以自動調試發生的任何異常,但我忘記它是什麼。)