歡迎光臨
每天分享高質量文章

Python 除錯器入門 | Linux 中國

Python 標準庫提供了一個名為 pdb 的除錯器。此除錯器提供了除錯所需的大多數功能,如斷點、單行步進、堆棧幀的檢查等等。
— Clément Verna


致謝
編譯自 | 
https://fedoramagazine.org/getting-started-python-debugger/
 
 作者 | Clément Verna
 譯者 | Liang Chen (Flowsnow) ???共計翻譯:20 篇 貢獻時間:989 天

Python 生態系統包含豐富的工具和庫,可以讓開發人員更加舒適。 例如,我們之前已經介紹瞭如何使用交互式 shell 增強 Python[1]。本文重點介紹另一種可以節省時間並提高 Python 技能的工具:Python 除錯器。

Python 除錯器

Python 標準庫提供了一個名為 pdb 的除錯器。此除錯器提供了除錯所需的大多數功能,如斷點、單行步進、堆棧幀的檢查等等。

瞭解一些pdb 的基本知識很有用,因為它是標準庫的一部分。 你可以在無法安裝其他增強的除錯器的環境中使用它。

運行 pdb

運行 pdb 的最簡單方法是從命令列,將程式作為引數傳遞來除錯。 看看以下腳本:

  1. # pdb_test.py

  2. #!/usr/bin/python3

  3. from time import sleep

  4. def countdown(number):

  5.    for i in range(number, 0, -1):

  6.        print(i)

  7.        sleep(1)

  8. if __name__ == "__main__":

  9.    seconds = 10

  10.    countdown(seconds)

你可以從命令列運行 pdb,如下所示:

  1. $ python3 -m pdb pdb_test.py

  2. > /tmp/pdb_test.py(1)<module>()

  3. -> from time import sleep

  4. (Pdb)

使用 pdb 的另一種方法是在程式中設置斷點。為此,請匯入 pdb 模塊並使用set_trace 函式:

  1. # pdb_test.py

  2. #!/usr/bin/python3

  3. from time import sleep

  4. def countdown(number):

  5.    for i in range(number, 0, -1):

  6.        import pdb; pdb.set_trace()

  7.        print(i)

  8.        sleep(1)

  9. if __name__ == "__main__":

  10.    seconds = 10

  11.    countdown(seconds)

  1. $ python3 pdb_test.py

  2. > /tmp/pdb_test.py(6)countdown()

  3. -> print(i)

  4. (Pdb)

腳本在斷點處停止,pdb 顯示腳本中的下一行。 你也可以在失敗後執行除錯器。 這稱為事後除錯postmortem debugging

穿行於執行堆棧

除錯中的一個常見用例是在執行堆棧中穿行。 Python 除錯器運行後,可以使用以下命令:

w(here):顯示當前執行的行以及執行堆棧的位置。

  1. $ python3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) w

  5. /tmp/test_pdb.py(16)<module>()

  6. -> countdown(seconds)

  7. > /tmp/test_pdb.py(10)countdown()

  8. -> print(i)

  9. (Pdb)

l(ist):顯示當前位置周圍更多的背景關係(代碼)。

  1. $ python3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) l

  5. 5

  6. 6

  7. 7     def countdown(number):

  8. 8         for i in range(number, 0, -1):

  9. 9             import pdb; pdb.set_trace()

  10. 10  ->         print(i)

  11. 11             sleep(1)

  12. 12

  13. 13

  14. 14     if __name__ == "__main__":

  15. 15         seconds = 10

u(p)/d(own):向上或向下穿行呼叫堆棧。

  1. $ py3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) up

  5. > /tmp/test_pdb.py(16)<module>()

  6. -> countdown(seconds)

  7. (Pdb) down

  8. > /tmp/test_pdb.py(10)countdown()

  9. -> print(i)

  10. (Pdb)

單步執行程式

pdb提供以下命令來執行和單步執行代碼:

◈ n(ext):繼續執行,直到達到當前函式中的下一行,或者傳回
◈ s(tep):執行當前行併在第一個可能的場合停止(在被呼叫的函式或當前函式中)

c(ontinue):繼續執行,僅在斷點處停止。

  1. $ py3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) n

  5. 10

  6. > /tmp/test_pdb.py(11)countdown()

  7. -> sleep(1)

  8. (Pdb) n

  9. > /tmp/test_pdb.py(8)countdown()

  10. -> for i in range(number, 0, -1):

  11. (Pdb) n

  12. > /tmp/test_pdb.py(9)countdown()

  13. -> import pdb; pdb.set_trace()

  14. (Pdb) s

  15. --Call--

  16. > /usr/lib64/python3.6/pdb.py(1584)set_trace()

  17. -> def set_trace():

  18. (Pdb) c

  19. > /tmp/test_pdb.py(10)countdown()

  20. -> print(i)

  21. (Pdb) c

  22. 9

  23. > /tmp/test_pdb.py(9)countdown()

  24. -> import pdb; pdb.set_trace()

  25. (Pdb)

該示例顯示了 next 和 step 之間的區別。 實際上,當使用 step 時,除錯器會進入 pdb 模塊原始碼,而接下來就會執行 set_trace 函式。

檢查變數內容

pdb 非常有用的地方是檢查執行堆棧中儲存的變數的內容。 例如,a(rgs) 命令打印當前函式的變數,如下所示:

  1. py3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) where

  5. /tmp/test_pdb.py(16)<module>()

  6. -> countdown(seconds)

  7. > /tmp/test_pdb.py(10)countdown()

  8. -> print(i)

  9. (Pdb) args

  10. number = 10

  11. (Pdb)

pdb 打印變數的值,在本例中是 10。

可用於打印變數值的另一個命令是 p(rint)

  1. $ py3 test_pdb.py

  2. > /tmp/test_pdb.py(10)countdown()

  3. -> print(i)

  4. (Pdb) list

  5. 5

  6. 6

  7. 7     def countdown(number):

  8. 8         for i in range(number, 0, -1):

  9. 9             import pdb; pdb.set_trace()

  10. 10  ->         print(i)

  11. 11             sleep(1)

  12. 12

  13. 13

  14. 14     if __name__ == "__main__":

  15. 15         seconds = 10

  16. (Pdb) print(seconds)

  17. 10

  18. (Pdb) p i

  19. 10

  20. (Pdb) p number - i

  21. 0

  22. (Pdb)

如示例中最後的命令所示,print 可以在顯示結果之前計算運算式。

Python 文件[2]包含每個 pdb 命令的參考和示例。 對於開始使用 Python 除錯器人來說,這是一個有用的讀物。

增強的除錯器

一些增強的除錯器提供了更好的用戶體驗。 大多數為 pdb 添加了有用的額外功能,例如語法突出高亮、更好的回溯和自省。 流行的增強除錯器包括 IPython 的 ipdb[3] 和 pdb++[4]

這些示例顯示如何在虛擬環境中安裝這兩個除錯器。 這些示例使用新的虛擬環境,但在除錯應用程式的情況下,應使用應用程式的虛擬環境。

安裝 IPython 的 ipdb

要安裝 IPython ipdb,請在虛擬環境中使用 pip

  1. $ python3 -m venv .test_pdb

  2. $ source .test_pdb/bin/activate

  3. (test_pdb)$ pip install ipdb

要在腳本中呼叫 ipdb,必須使用以下命令。 請註意,該模塊稱為 ipdb 而不是 pdb:

  1. import ipdb; ipdb.set_trace()

IPython 的 ipdb 也可以用 Fedora 包安裝,所以你可以使用 Fedora 的包管理器 dnf 來安裝它:

  1. $ sudo dnf install python3-ipdb

安裝 pdb++

你可以類似地安裝 pdb++:

  1. $ python3 -m venv .test_pdb

  2. $ source .test_pdb/bin/activate

  3. (test_pdb)$ pip install pdbp

pdb++ 重寫了 pdb 模塊,因此你可以使用相同的語法在程式中添加斷點:

  1. import pdb; pdb.set_trace()

總結

學習如何使用 Python 除錯器可以節省你在排查應用程式問題時的時間。 對於瞭解應用程式或某些庫的複雜部分如何工作也是有用的,從而提高 Python 開發人員的技能。


via: https://fedoramagazine.org/getting-started-python-debugger/

作者:Clément Verna[6] 選題:lujun9972 譯者:Flowsnow 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

赞(0)

分享創造快樂

© 2021 知識星球   网站地图