python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。 例如,我們之前已經介紹了如何使用互動式 shell 增強 python。本文重點介紹另一種可以節省時間並提高 python 技能的工具:python 偵錯程式。
python 偵錯程式
python 標準庫提供了乙個名為 pdb 的偵錯程式。此偵錯程式提供了除錯所需的大多數功能,如斷點、單行步進、堆疊幀的檢查等等。
了解一些pdb 的基本知識很有用,因為它是標準庫的一部分。 你可以在無法安裝其他增強的偵錯程式的環境中使用它。
執行 pdb
執行 pdb 的最簡單方法是從命令列,將程式作為引數傳遞來除錯。 看看以下指令碼:# pdb_test.py
#!/usr/bin/python3
from time import sleep def countdown(number):
for i in range(number, 0, -1):
print(i)
sleep(1) if __name__ == "__main__":
seconds = 10
countdown(seconds)
你可以從命令列執行 pdb,如下所示:$ python3 -m pdb pdb_test.py > /tmp/pdb_test.py(1)() -> from time import sleep (pdb)
使用 pdb 的另一種方法是在程式中設定斷點。為此,請匯入 pdb 模組並使用set_trace 函式:# pdb_test.py
#!/usr/bin/python3
from time import sleep def countdown(number):
for i in range(number, 0, -1):
import pdb; pdb.set_trace()
print(i)
sleep(1) if __name__ == "__main__":
seconds = 10
countdown(seconds)$ python3 pdb_test.py > /tmp/pdb_test.py(6)countdown() -> print(i) (pdb)
指令碼在斷點處停止,pdb 顯示指令碼中的下一行。 你也可以在失敗後執行偵錯程式。 這稱為事後除錯postmortem debugging。
穿行於執行堆疊
除錯中的乙個常見用例是在執行堆疊中穿行。 python 偵錯程式執行後,可以使用以下命令:w(here):顯示當前執行的行以及執行堆疊的位置。$ python3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) w /tmp/test_pdb.py(16)() -> countdown(seconds) > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb)l(ist):顯示當前位置周圍更多的上下文(**)$ python3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) l 5 6 7
def countdown(number): 8
for i in range(number, 0, -1): 9
import pdb; pdb.set_trace() 10 ->
print(i) 11
sleep(1) 12 13 14
if __name__ == "__main__": 15
seconds = 10u(p)/d(own):向上或向下穿行呼叫堆疊。$ py3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) up > /tmp/test_pdb.py(16)() -> countdown(seconds) (pdb) down > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb)
單步執行程式
s(tep):執行當前行並在第乙個可能的場合停止(在被呼叫的函式或當前函式中)
c(ontinue):繼續執行,僅在斷點處停止。$ py3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) n 10 > /tmp/test_pdb.py(11)countdown() -> sleep(1) (pdb) n > /tmp/test_pdb.py(8)countdown() -> for i in range(number, 0, -1): (pdb) n > /tmp/test_pdb.py(9)countdown() -> import pdb; pdb.set_trace() (pdb) s --call-- > /usr/lib64/python3.6/pdb.py(1584)set_trace() -> def set_trace(): (pdb) c > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) c 9 > /tmp/test_pdb.py(9)countdown() -> import pdb; pdb.set_trace() (pdb)
該示例顯示了 next 和 step 之間的區別。 實際上,當使用 step 時,偵錯程式會進入 pdb 模組源**,而接下來就會執行 set_trace 函式。
檢查變數內容pdb 非常有用的地方是檢查執行堆疊中儲存的變數的內容。 例如,a(rgs) 命令列印當前函式的變數,如下所示:py3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) where /tmp/test_pdb.py(16)() -> countdown(seconds) > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) args number = 10 (pdb)
pdb 列印變數的值,在本例中是 10。可用於列印變數值的另乙個命令是 p(rint)。$ py3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (pdb) list 5 6 7
def countdown(number): 8
for i in range(number, 0, -1): 9
import pdb; pdb.set_trace() 10 ->
print(i) 11
sleep(1) 12 13 14
if __name__ == "__main__": 15
seconds = 10 (pdb) print(seconds) 10 (pdb) p i 10 (pdb) p number - i 0 (pdb)
如示例中最後的命令所示,print 可以在顯示結果之前計算表示式。
python 文件包含每個 pdb 命令的參考和示例。 對於開始使用 python 偵錯程式人來說,這是乙個有用的讀物。
增強的偵錯程式
一些增強的偵錯程式提供了更好的使用者體驗。 大多數為 pdb 新增了有用的額外功能,例如語法突出高亮、更好的回溯和自省。 流行的增強偵錯程式包括 ipython 的 ipdb 和 pdb++。
這些示例顯示如何在虛擬環境中安裝這兩個偵錯程式。 這些示例使用新的虛擬環境,但在除錯應用程式的情況下,應使用應用程式的虛擬環境。
安裝 ipython 的 ipdb
要安裝 ipython ipdb,請在虛擬環境中使用 pip:$ python3 -m venv .test_pdb
$ source .test_pdb/bin/activate (test_pdb)
$ pip install ipdb
要在指令碼中呼叫 ipdb,必須使用以下命令。 請注意,該模組稱為 ipdb 而不是 pdb:import ipdb; ipdb.set_trace()
ipython 的 ipdb 也可以用 fedora 包安裝,所以你可以使用 fedora 的包管理器 dnf 來安裝它:$ sudo dnf install python3-ipdb
安裝 pdb++
你可以類似地安裝 pdb++:$ python3 -m venv .test_pdb $ source .test_pdb/bin/activate (test_pdb)$ pip install pdbp
pdb++ 重寫了 pdb 模組,因此你可以使用相同的語法在程式中新增斷點:import pdb; pdb.set_trace()
總結學習如何使用 python 偵錯程式可以節省你在排查應用程式問題時的時間。 對於了解應用程式或某些庫的複雜部分如何工作也是有用的,從而提高 python 開發人員的技能。
python的偵錯程式 玩轉Python偵錯程式
如果你還只會使用print來定位python程式問題,那這篇文章就是為你寫的,這篇文章將帶你入門python偵錯程式。python標準庫提供了乙個叫pdb的偵錯程式,它提供了除錯所需的絕大多數常用功能,比如斷點 單行步進 堆疊幀資料的檢查等。了解一些python pdb的基本用法和知識,將極大的提高...
Python 偵錯程式入門
python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。例如,我們之前已經介紹了如何使用互動式 shell 增強 python。本文重點介紹另一種可以節省時間並提高 python 技能的工具 python 偵錯程式。python 標準庫提供了乙個名為 pdb 的偵錯程式。此偵錯程式提供了除...
Python偵錯程式命令
命令 功能h elp 顯示命令列表 help command 顯示command的文件 c ontinue 恢復程式執行 q uit 退出偵錯程式,不再執行任何 b reak number 在當前檔案的第number行設定乙個斷點 b path to file.py number 在當前檔案的第nu...