詳解Python除錯神器之PySnooper

2022-09-24 14:33:21 字數 2963 閱讀 6717

相信很多程式設計師在除錯**時,都用過 print。**少還好說,如果是大型專案,面對眾多 print 的輸出結果,可能要頭大了。

今天推薦乙個 github 熱門開源專案:pysnooper。該專案推出的第一天就收穫 2000+ star,登上了 github 日榜第一位,如今有近 15k star。可見這是一款 python 開發者喜歡的工具。歡迎學習、喜歡點讚支援,文末技術交流可以暢聊!

鏈結:如果你寫的 python **不能按如期那樣執行,你會絞盡腦汁想為啥出錯了。雖然你希望有支援斷點的成熟偵錯程式,但或許你現在不想去設定這樣的偵錯程式。

你想知道哪些行代程式設計客棧碼是正常執行,哪些行不正常。據說大多數人會在可疑位置使用 print 輸出語句。

其實 pysnooper 的作用有點類似,你不用小心翼翼地用 print 輸出,只需在想除錯的函式中引入乙個裝飾器。然後得到函式的詳細日誌,包括執行了哪些行、何時執行,以及何時更改了區域性變數。

因為你可以在不需要進行任何設定的情況下將其用於糟糕的、龐大的企業**庫中。只需開啟裝飾器(如下示例所示),並將輸出重定向到乙個專用的日誌檔案,將日誌檔案路徑指定為第乙個引數。

ps:如果無法訪問 stderr,那可以將輸出重定向到指定檔案,比如 :@pysnooper.snoop('/my/log/file.log')

範例是乙個把數字轉成二進位制的函式。

import pysnooper

@pysnooper.snoop()

def number_to_bits(number):

if number:

bits =

while number:

number, remainder = divmod(number, 2)

bits.insert(0, remainder)

return bits

else:

return [0]

number_to_bits(6)

starting var:.. number = 6

21:14:32.099769 call 3 @pysnooper.snoop()

21:14:32.099769 line 5 if number:

21:14:32.099769 line 6 bits =

new var:....... bits =

21:14:32.099769 line 7 while number:

21:14:32.099769 line 8 number, remainder = divmod(number, 2)

new var:....... remainder = 0

modified var:.. number = 3

21:14:32.099769 line 9 bits.insert(0, remainder)

modified var:.. bits = [0]

21:14:32.099769 line 7 while number:

21:14:32.099769 line 8 number, remainder = divmod(number, 2)

modified var:.. number = 1

modified var:.. remainder = 1

21:14:32.099769 line 9 bits.insert(0, remainder)

modified var:.. bits = [1, 0]

21:14:32.099769 line 7 while number:

21:14:32.099769 line 8 number, remainder = divmod(number, 2)

modified var:.. number = 0

21:14:32.099769 line 9 bits.insert(0, remainder)

modified var:.. bits = [1, 1, 0]

21:14:32.099769 line 7 while number:

21:14:32.099769 line 10 return bits

21:14:32.099769 return 10 return bits

如果你不想追蹤整個函式,那可以用with塊包裝你想追蹤的那部分,如下:

import pysnooper

import random

def foo():

lst =

for i in range(10):

lst.append(random.randrange(1, 1000))

with pysnooper.snoop():

lower = min(lst)

upper = max(lst)

mid = (lower + upper) / 2

print(lower, mid, upper)

foo()

new var:....... i = 9

new var:....... lst = [681, 267, 74, 832, 284, 678, ...]

09:37:35.881721 line 10 lower = min(lst)

new var:....... lower = 74

09:37:35.882137 line 11 upper = max(lst)

new var:....... upper = 832

09:37:35.882304 line 12 mid = (lower + upper) / 2

74 453.0 832

new var:....... mid = 453.0

09:37:35.882486 line 13 print(lower, mid, upper)

elapsed time: 00:00:00.000344

最佳方式:pip

$ pip install pysnooper

其他方式:

歡迎**、、有所收穫點讚支援一下!

python除錯神器 icecream

icecream是乙個python第三方庫,可通過最少的 使列印除錯更清晰明了。你可以直接使用pip install icecream來進行安裝。from icecream import ic num1 20 num2 30 ic num1 ic num2 程式輸出結果為 ic num1 20 ic...

Python三大神器之pip用法詳解

安裝軟體 pip3 install package 示例 sudo pip3 install requests 公升級軟體 pip3 install upgrade package 示例 sudo pip3 install upgrade requests 解除安裝軟體 pip3 uninstall...

你必須擁有的Python除錯神器

今天推薦乙個python除錯工具可以讓你的除錯更快更方便,叫ipdb。知道的朋友都知道我一般操作就是pycharm vim的模式,原因我解釋過了,既能使用vim編輯器之神的配置,也能用到pycharm這種ide的方便。安裝使用一般就是 pip install ipdb,相信大家沒啥問題,這裡我們可以...