標籤:
調試
第一種方法簡單直接粗暴有效,就是用print
把可能有問題的變數列印出來看看:
>>> def foo(s):n= int(s)print ‘>>> n = %d‘ % nreturn 10 / n>>> def main():foo(‘0‘)>>> main()>>> n = 0Traceback (most recent call last):File "<pyshell#25>", line 1, in <module>main()File "<pyshell#24>", line 2, in mainfoo(‘0‘)File "<pyshell#22>", line 4, in fooreturn 10 / nZeroDivisionError: integer division ormodulo by zero
斷言
凡是用print來輔助查看的地方,都可以用斷言(assert)來替代:
>>> def foo(s):n=int(s)assertn!=0,‘n is zero‘return10/n>>> def main():foo(‘0‘)>>> main()Traceback (most recent call last):File "<pyshell#37>", line 1, in <module>main()File "<pyshell#36>", line 2, in mainfoo(‘0‘)File "<pyshell#32>", line 3, in fooassert n!=0,‘n is zero‘AssertionError: n is zero
logging
把print替換為logging是第3種方式,和assert比,logging不會拋出錯誤,而且可以輸出到檔案:
>>> import logging>>>logging.basicConfig(level=logging.INFO)>>> s=‘0‘>>> n=int(s)>>> logging.info(‘n=%d‘ % n)>>> print 10/n Traceback (most recent call last):File "<pyshell#48>", line 1, in <module>print 10/nZeroDivisionError: integer division ormodulo by zero
pdb
第4種方式是啟動Python的調試器pdb,讓程式以單步方式運行,可以隨時查看運行狀態。
# err.pys = ‘0‘n = int(s)print 10 / n$ python -m pdb err.py> /Users/michael/Github/sicp/err.py(2)<module>()-> s = ‘0‘
以參數-m pdb啟動後,pdb定位到下一步要執行的代碼-> s = ‘0‘。輸入命令l來查看代碼:
(Pdb) l
1 # err.py
2 -> s = ‘0‘
3 n = int(s)
4 print 10 / n
[EOF]
輸入命令n可以逐步執行代碼:
(Pdb) n
>/Users/michael/Github/sicp/err.py(3)<module>()
-> n = int(s)
(Pdb) n
>/Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
任何時候都可以輸入命令p 變數名來查看變數:
(Pdb) p s
‘0‘
(Pdb) p n
0
輸入命令q結束調試,退出程式:
(Pdb) n
ZeroDivisionError: ‘integer division ormodulo by zero‘
>/Users/michael/Github/sicp/err.py(4)<module>()
-> print 10 / n
(Pdb) q
Try
這種通過pdb在命令列調試的方法理論上是萬能的,但實在是太麻煩
pdb.set_trace()
這個方法也是用pdb,但是不需要逐步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設定一個斷點:
# err.py
import pdb
s = ‘0‘
n = int(s)
pdb.set_trace() # 運行到這裡會自動暫停
print10 / n
運行代碼,程式會自動在pdb.set_trace()暫停並進入pdb調試環境,可以用命令p查看變數,或者用命令c繼續運行:
$ python err.py
>/Users/michael/Github/sicp/err.py(7)<module>()
-> print 10 / n
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
File "err.py", line 7, in <module>
print 10 / n
ZeroDivisionError: integer division ormodulo by zero
這個方式比直接啟動pdb單步調試效率要高很多,但也高不到哪去。
Python學習 Day 12 調試 斷言 logging pdb pdb.set_trace