我想讓我的調試器在遇到異常時運行post_mortem()
,不需要必須修改我正在處理的源代碼。我看到很多涉及將代碼封裝在try/except塊中的示例,但我希望它始終運行,無論我在做什麼。總是調用異常時調用python調試器的一般方法
我在一個python包裝腳本上工作,但是這個腳本很醜,幾乎不能使用。
我使用pudb,它與API等效於pdb,因此pdb特定的答案很好。我從我的編輯器(vim)中運行代碼,並希望在遇到異常時隨時提供下午。
我想讓我的調試器在遇到異常時運行post_mortem()
,不需要必須修改我正在處理的源代碼。我看到很多涉及將代碼封裝在try/except塊中的示例,但我希望它始終運行,無論我在做什麼。總是調用異常時調用python調試器的一般方法
我在一個python包裝腳本上工作,但是這個腳本很醜,幾乎不能使用。
我使用pudb,它與API等效於pdb,因此pdb特定的答案很好。我從我的編輯器(vim)中運行代碼,並希望在遇到異常時隨時提供下午。
一個可能的解決方案是調用pdb
(我不知道pudb
,但我只是假設它的工作原理相同)的腳本:
python -m pdb script.py
當作爲腳本調用時,如果正在調試的程序異常退出,pdb將自動輸入驗證後 調試。經過 驗屍調試(或程序正常退出後),pdb將 重新啓動程序。
花了幾個月的時間沒做任何事情,但我偶然發現了一個解決方案。我敢肯定這對於更有經驗的人來說並不是什麼新鮮事。
我在我的環境如下:
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__
。我發現它總是能夠依賴某些可用的工具而非常方便。
味道。
OH。 MY。神。是。 <3 <3 <3 – 2015-06-01 23:30:33
是的。這就是文檔所說的,但是如果我運行它,即使是在一個平凡的腳本中,我也總是進入調試器: $ echo''> /tmp/x.py && python -m pdb /tmp/x.py > /tmp/x.py(1)() - > (Pdb) – 2013-05-06 10:50:53
您是對的,程序不會立即啓動。您可以在家庭或項目目錄中添加一個包含'continue'的.pdbrc文件,但不幸的是[這是自3.2以來才支持的](http://docs.python.org/dev/library/pdb。html#module-pdb) – icecrime 2013-05-07 09:01:53
看起來這與pudb有一個顯着的區別。沒有「.pudbrc」。 – 2013-05-07 09:47:31