本文討論在沒有方便的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
(pdb)
單步執行: 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) b14
執行到斷點: c
(pdb) c
> /*****
-> print "level 3"
(pdb) l
9 print 0
10 elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
13 elif val <= 6500 :
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)
說明:
pdb還有很多其他很多有用的指令,讀者可以自行探索。輸入h,h 命令。就可以得到命令的詳細幫助。
不過,我個人認為一般無需啟動這種除錯方法,一般使用日誌輸出進行除錯即可,除非遇到了非常微妙的錯誤。這時,單步除錯的威力便顯示出來了。
(pdb)b 1
breakpoint 1 at
c:\test.py:1
()後面的vc++除錯中斷方式。
b(reak) [[filename:]lineno|function[, condition]]
在指定的檔案、行數或函式下進行斷點設定。也可為中斷點設定中斷條件,例如要在 for迴圈下進行中斷設定或某個值出現時中斷,就可以進行相應中斷點條件的設定。如果沒有能數,則列出所有中斷點。
tbreak [[filename:]lineno|function[, condition]]
和 b 一樣,但只會中斷一次
c(ont(inue))
繼續執行,直到中斷點f5)
s(tep)
執行當前(f10)
n(ext)
和 s 一樣執行目前行。。不同的是如果是引數,則進入函式內(f11)
w(here)
列出目前 call stack 中的所在層。
d(own)
在 call stack 中往下移一層。
u( p)
在 call stack 中往上移一層。如果在上移一層之後按下 n ,則會在上移之後的一層,再去執行下一層。
cl(ear) [bpnumber [bpnumber ...]]
清除指定的中斷點。如果無引數,則清除所有中斷點
disable [bpnumber [bpnumber ...]]
取消所有中斷點的功能,但是保留中斷點
enable [bpnumber [bpnumber ...]]
恢昨中斷點功能。
ignore bpnumber [count]
設定中斷的忽略次數,如果沒指定count,則初始為0.當count 為0,則中斷點會正常動作。若有指定 count,則每次執行該中斷。, count 就少 1,直到 count 為0
condition bpnumber [condition]
為某個中斷點,設定中斷條件。
j(ump) lineno
跳到某行執行。只有在 call stack 的最底部才能作用。
l(ist) [first[, last]]
列出目前所在檔案中的的位置。邊續地
a(rgs)
列出目前函式所接受的引數
p expression
在目前的環境(context)中求出 expression 的值。
pp expression
和 p 命令類似,但是使用 pprint module(沒用過 pprint,可看 python library reference)。
alias [name [command]]
以乙個別名代替所有除錯除錯命令。類似c/c++ 的 macro(詳情參考 python library reference)。
unalias name
取消某個 alias。
[!]statement
在目前的環境(context)中執行描述
q(uit)
退出除錯模式。
原文:
使用pdb除錯python
python pdb除錯 python m pdb myscript.py 注意這會重啟myscript.py,這樣啟動的話,每一行都是乙個節點 也可以在程式中這麼設定斷點 import pdb pdb.set trace 支援的命令 p 列印變數 n next step 細點執行 c contin...
使用pdb除錯python
python pdb除錯 python m pdb myscript.py 注意這會重啟myscript.py,這樣啟動的話,每一行都是乙個節點 也可以在程式中這麼設定斷點 import pdb pdb.set trace 支援的命令 p 列印變數 n next step 細點執行 c contin...
在python中使用websocket
介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...