python調試利器pysnooper

安裝

安裝方法很簡單,可以使用 pip 或 anaconda 兩種安裝方法:

$ pip install pysnooper

或者

$ conda install -c conda-forge pysnooper

監控整個函數

一個使用例子如下,首先是需要導入 pysnooper ,然後想知道函數 number_to_bits() 的運行情況,只需要添加 @pysnooper.snoop() 即可。


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
14:52:10.169804 call         4 def number_to_bits(number):
14:52:10.169899 line         5     if number:
14:52:10.169923 line         6         bits = []
New var:....... bits = []
14:52:10.169940 line         7         while number:
14:52:10.169963 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
14:52:10.169981 line         9             bits.insert(0, remainder)
Modified var:.. bits = [0]
14:52:10.170006 line         7         while number:
14:52:10.170028 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
14:52:10.170045 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
14:52:10.170068 line         7         while number:
14:52:10.170088 line         8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
14:52:10.170104 line         9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
14:52:10.170124 line         7         while number:
14:52:10.170143 line        10         return bits
14:52:10.170159 return      10         return bits
Return value:.. [1, 1, 0]

監控函數一部分

通過使用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:....... lst = [166, 196, 138, 683, 176, 265, 838, 597, 105, 407]
New var:....... i = 9
14:55:33.853343 line        10         lower = min(lst)
New var:....... lower = 105
14:55:33.853460 line        11         upper = max(lst)
New var:....... upper = 838
105 471.5 838
14:55:33.853492 line        12         mid = (lower + upper) / 2
New var:....... mid = 471.5
14:55:33.853520 line        13         print(lower, mid, upper)

其他使用技巧

重定向到文件, 在文件中查看

@pysnooper.snoop('/my/log/file.log')

監控函數外變量

@pysnooper.snoop(watch=('number','number1'))
def number_to_bits():
    global number
    if number:

查看list或者dict等引用的每個元素的值的變化(默認只顯示整個對象的變化,不會針對每個元素的變化提示)

@pysnooper.snoop(watch_explode=('bits','bits1'))

跟蹤的函數深度,默認爲1,只跟蹤當前函數的變量的變化

@pysnooper.snoop(depth=2)

在跟蹤日誌前面加前綴, 方便跟自己的日誌進行區分

@pysnooper.snoop(prefix='ZZZ ')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章