天天看點

[轉] python程式的調試方法

本文讨論在沒有友善的IDE工具可用的情況下,使用pdb調試python程式

源碼例子

例如,有模拟稅收計算的程式:

#!/usr/bin/python 
def debug_demo(val): 
                if val <= 1600 : 
                                print "level 1" 
                                print 0 
                elif val <= 3500 : 
                                print "level 2" 
                                print (val - 1600) * 0.05 
                elif val <= 6500 : 
                                print "level 3" 
                                print (val - 3500) * 0.10 + (3500-1600) * 0.05 
                else: 
                                print "level 4" 
                                print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 
#~def debug_demo                 
if __name__ == "__main__": 
                debug_demo(4500)      

debug_demo函數計算4500的入賬所需的稅收。

如何調試?

1.加入斷點

在需要插入斷點的地方,加入紅色部分代碼:如果_DEBUG值為True,則在該處開始調試(加入_DEBUG的原因是為了友善打開/關閉調試)。

#!/usr/bin/python 

_DEBUG=True 

def debug_demo(val): 

                if _DEBUG == True: 

                                import pdb 

                                pdb.set_trace() 

                if val <= 1600 : 

                                print "level 1" 

                                print 0 

                elif val <= 3500 : 

                                print "level 2" 

                                print (val - 1600) * 0.05 

                elif val <= 6500 : 

                                print "level 3" 

                                print (val - 3500) * 0.10 + (3500-1600) * 0.05 

                else: 

                                print "level 4" 

                                print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 

#~def debug_demo                 

if __name__ == "__main__": 

                debug_demo(4500)

2.開始運作調試

  運作程式./debug_demo.py,得到

> /usr/local/qspace/user_network/debug_demo.py(7)debug_demo() 

-> if val <= 1600 : 

(Pdb)

-> val <= 1600 : 訓示目前執行的語句,(Pdb)等待你的調試指令. pdb的指令很豐富,輸入h指令可以檢視指令的使用方法。

下面簡單介紹常用指令:

  檢視代碼上下文,l(小寫L)

(Pdb) l 

    2         _DEBUG=True 

    3         def debug_demo(val): 

    4                         if _DEBUG == True: 

    5                                         import pdb 

    6                                         pdb.set_trace() 

    7    ->                 if val <= 1600 : 

    8                                         print "level 1" 

    9                                         print 0 

  10                         elif val <= 3500 : 

  11                                         print "level 2" 

  12                                         print (val - 1600) * 0.05 

(Pdb)   

左邊是行号,右邊是代碼正文。

  監視變量:p 變量名

(Pdb) p val 

4500 

單步執行: n

-> elif val <= 3500 : 

(Pdb) l  

  5                                         import pdb  

  6                                         pdb.set_trace()  

  7                         if val <= 1600 :  

  8                                         print "level 1"  

  9                                         print 0 

10    ->                 elif val <= 3500 : 

11                                         print "level 2" 

12                                         print (val - 1600) * 0.05 

13                         elif val <= 6500 : 

14                                         print "level 3" 

15                                         print (val - 3500) * 0.10 + (3500-1600) * 0.05

加入斷點:b 行号

(Pdb) b 14

運作到斷點: c

(Pdb) c 

> /***** 

-> print "level 3" 

10                         elif val <= 3500 : 

14 B->                                 print "level 3" 

15                                         print (val - 3500) * 0.10 + (3500-1600) * 0.05 

16                         else: 

17                                         print "level 4" 

18                                         print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 

19    

執行到函數傳回前: r

(Pdb) r 

level 3 

195.0 

--Return-- 

> /****()

->None 

-> print (val - 3500) * 0.10 + (3500-1600) * 0.05 

說明:

pdb還有很多其他很多有用的指令,讀者可以自行探索。輸入h,h 指令。就可以得到指令的詳細幫助。

不過,我個人認為一般無需啟動這種調試方法,一般使用日志輸出進行調試即可,除非遇到了非常微妙的錯誤。這時,單步調試的威力便顯示出來了

你們的評論、回報,及對你們有所用,是我整理材料和博文寫作的最大的鼓勵和唯一動力。歡迎讨論和關注!

沒有整理與歸納的知識,一文不值!高度概括與梳理的知識,才是自己真正的知識與技能。

永遠不要讓自己的自由、好奇、充滿創造力的想法被現實的架構所束縛,讓創造力自由成長吧!

多花時間,關心他(她)人,正如别人所關心你的。理想的騰飛與實作,沒有别人的支援與幫助,是萬萬不能的。