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 ')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章