我想調試代碼執行時發生的警告。如何在警告時自動切換到調試模式?
一個簡單的斷點不會這樣做,因爲在發生第一個警告之前,導致警告的那一行會在沒有警告的情況下執行數百萬次。
此外,發生這種情況的行是在庫代碼中(更準確地說,在pandas/core/common.py
),所以我的首選是根本不修改代碼。
我只想在發出警告時停止程序的執行權,並在此時檢查堆棧,使用pdb
或ipdb
。
有沒有辦法配置調試器在發出警告時自動進入單步模式?
我想調試代碼執行時發生的警告。如何在警告時自動切換到調試模式?
一個簡單的斷點不會這樣做,因爲在發生第一個警告之前,導致警告的那一行會在沒有警告的情況下執行數百萬次。
此外,發生這種情況的行是在庫代碼中(更準確地說,在pandas/core/common.py
),所以我的首選是根本不修改代碼。
我只想在發出警告時停止程序的執行權,並在此時檢查堆棧,使用pdb
或ipdb
。
有沒有辦法配置調試器在發出警告時自動進入單步模式?
您可以編寫一個腳本dbg.py
:
import pdb, warnings, sys
import __builtin__
if __name__ == '__main__':
args, n = [], len(sys.argv)
if n < 2:
sys.exit(1)
elif n > 2:
args.append(__builtin__.__dict__[sys.argv[2]])
if n > 3:
args.append(int(sys.argv[3]))
warnings.simplefilter('error', *args) # treat warnings as exceptions
try:
execfile(sys.argv[1])
except:
pdb.post_mortem(sys.exc_info()[-1])
然後,您可以使用它來調試腳本這樣。在你的腳本名稱作爲第一個參數傳遞,如果你想在任何警告的情況下PDB:
$ python dbg.py yourscript.py
通在預警類型的第二個參數,如果你只希望在警告某些特定類型的提高PDB運行:
$ python dbg.py yourscript.py DeprecationWarning
行號作爲第三個參數:
$ python dbg.py yourscript.py DeprecationWarning 342
您也可以使用warnings.filterwarnings
重寫代碼,而不是warnings.simplefilter
使警告過濾更靈活。
我發現rpdb
非常方便調試這樣的問題,當你沒有啓動該程序的控制。你需要的是臨時修改pandas/core/common.py
添加
import rpdb
debugger = rpdb.Rpdb(port=12345)
debugger.set_trace()
被觸發報警時,調試器會在那裏等待連接。然後連接到調試器並檢查堆棧。
你的意思是說,如果你在那時插入'import pdb; pdb.set_trace()',基本上會發生什麼? –
@ Two-BitAlchemist:是的,除此之外,我寫的是,我不想真正修改正在調試的代碼。 – kjo
警告是警告,不是例外。調試器不會撿起它。通常你要麼改變代碼來防止警告,要麼按照下面的描述壓制它:https://docs.python.org/2/library/warnings.html。如果您需要特定警告的幫助,只需詢問! –