Python 偵錯程式入門
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)<module>()
-> 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 顯示指令碼中的下一行。 你也可以在失敗後執行偵錯程式。 這稱為事後除錯。
穿行於執行堆疊
除錯中的一個常見用例是在執行堆疊中穿行。 Python 偵錯程式執行後,可以使用以下命令:
-
w(here)
:顯示當前執行的行以及執行堆疊的位置。$ python3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (Pdb) w /tmp/test_pdb.py(16)<module>() -> 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 = 10
-
u(p)
/d(own)
:向上或向下穿行呼叫堆疊。$ py3 test_pdb.py > /tmp/test_pdb.py(10)countdown() -> print(i) (Pdb) up > /tmp/test_pdb.py(16)<module>() -> countdown(seconds) (Pdb) down > /tmp/test_pdb.py(10)countdown() -> print(i) (Pdb)
單步執行程式
pdb提供以下命令來執行和單步執行程式碼:
n(ext)
:繼續執行,直到達到當前函式中的下一行,或者返回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)<module>() -> 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 開發人員的技能。
via: https://fedoramagazine.org/getting-started-python-debugger/
作者:Clément Verna 選題:lujun9972 譯者:Flowsnow 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- Xcode偵錯程式LLDBXCodeLLDB
- PsySH作為偵錯程式
- 幽默:編寫Python程式碼你們使用什麼偵錯程式?Python
- 優秀開發者必備技能包:Python偵錯程式Python
- 偵錯程式到底怎樣工作
- 反除錯 -- 利用ptrace阻止偵錯程式附加除錯
- Emacs 除錯祕籍之 GUD 偵錯程式Mac除錯
- 偵錯程式是個大騙子!
- GDB偵錯程式(學習筆記)筆記
- Linux gdb偵錯程式用法全面解析Linux
- 另一個Swoole偵錯程式 - Yasd
- Python 入門級報錯處理Python
- Python程式設計入門Python程式設計
- Rails開發中使用byebug偵錯程式AI
- 在Docker內部使用gdb偵錯程式報錯-Operation not permittedDockerMIT
- tokio-rs/console:非同步 Rust 偵錯程式非同步Rust
- 如何在Docker內部使用gdb偵錯程式Docker
- 2.IDEA,Maven,偵錯程式的基本使用IdeaMaven
- 反除錯&反反除錯 -- 利用sysctl檢測偵錯程式是否存在除錯
- 【盤點】Python新手入門常犯的錯誤!Python
- 如何學習python程式語言?python入門Python
- 為什麼在Docker裡使用gdb偵錯程式會報錯Docker
- Python 非同步程式設計入門Python非同步程式設計
- Python入門(六):程式控制結構Python
- 深入理解python虛擬機器:偵錯程式實現原理與原始碼分析Python虛擬機原始碼
- 程式碼除錯-入門、實踐到原理除錯
- python程式設計真的好學嗎?python入門Python程式設計
- 5 個鮮為人知 GNU 偵錯程式(GDB)技巧
- 入門python多執行緒/多程式Python執行緒
- PyCharm入門第一步(二):除錯第一個Python應用程式PyCharm除錯Python
- Python入門Python
- Python新手入門最容易犯的錯誤有哪些?Python
- Python學習常見的錯誤有哪些?Python基礎入門Python
- 前端除錯入門前端除錯
- Python快速程式設計入門課後程式題答案Python程式設計
- SAP技術專家的ABAP偵錯程式培訓材料
- Python入門基礎—購物車小程式Python
- 《Python程式設計:從入門到實踐》Python程式設計