2013-05-06 36 views
3

我想讓我的調試器在遇到異常時運行post_mortem()不需要必須修改我正在處理的源代碼。我看到很多涉及將代碼封裝在try/except塊中的示例,但我希望它始終運行,無論我在做什麼。總是調用異常時調用python調試器的一般方法

我在一個python包裝腳本上工作,但是這個腳本很醜,幾乎不能使用。

我使用pudb,它與API等效於pdb,因此pdb特定的答案很好。我從我的編輯器(vim)中運行代碼,並希望在遇到異常時隨時提供下午。

回答

1

一個可能的解決方案是調用pdb(我不知道pudb,但我只是假設它的工作原理相同)的腳本:

python -m pdb script.py 

引述the documentation

當作爲腳本調用時,如果正在調試的程序異常退出,pdb將自動輸入驗證後 調試。經過 驗屍調試(或程序正常退出後),pdb將 重新啓動程序。

+0

是的。這就是文檔所說的,但是如果我運行它,即使是在一個平凡的腳本中,我也總是進入調試器: $ echo''> /tmp/x.py && python -m pdb /tmp/x.py > /tmp/x.py(1)() - > (Pdb) – 2013-05-06 10:50:53

+0

您是對的,程序不會立即啓動。您可以在家庭或項目目錄中添加一個包含'continue'的.pdbrc文件,但不幸的是[這是自3.2以來才支持的](http://docs.python.org/dev/library/pdb。html#module-pdb) – icecrime 2013-05-07 09:01:53

+0

看起來這與pudb有一個顯着的區別。沒有「.pudbrc」。 – 2013-05-07 09:47:31

4

花了幾個月的時間沒做任何事情,但我偶然發現了一個解決方案。我敢肯定這對於更有經驗的人來說並不是什麼新鮮事。

我在我的環境如下:

export PYTHONUSERBASE=~/.python 
export PYTHONPATH=$PYTHONPATH:$PYTHONUSERBASE 

而且我有以下文件:

~/.python/lib/python2.7/site-packages/usercustomize.py 

具有以下內容:

import traceback 
import sys 

try: 
    import pudb as debugger 
except ImportError: 
    import pdb as debugger 

def drop_debugger(type, value, tb): 
    traceback.print_exception(type, value, tb) 
    debugger.pm() 

sys.excepthook = drop_debugger 

__builtins__['debugger'] = debugger 
__builtins__['st'] = debugger.set_trace 

現在,無論是交互方式或否則,調試器在出現異常時總是跳入。把它弄明白可能不錯。

確保您的site-packages中沒有no-global-site-packages.txt是很重要的。這將禁用usercustomize模塊默認site.py(我的virtualenv有no-global-site-packages.txt

萬一它會幫助別人,我在位左有關修改__builtins__。我發現它總是能夠依賴某些可用的工具而非常方便。

味道。

+0

OH。 MY。神。是。 <3 <3 <3 – 2015-06-01 23:30:33