当前位置: 首页 > 工具软件 > PySnooper > 使用案例 >

python调试工具pysnooper用法_[全]使用PySnooper调试代码

澹台成龙
2023-12-01

《[全]使用PySnooper调试代码》由会员分享,可在线阅读,更多相关《[全]使用PySnooper调试代码(12页珍藏版)》请在人人文库网上搜索。

1、使用 PySnooper 调试代码1. 快速安装执行下面这些命令进行安装 PySnooper$ python3 -m pip install pysnooper# 或者$ conda install -c conda-forge pysnooper# 或者$ yay -S python-pysnooper2. 简单案例下面这段代码,定义了一个 demo_func 的函数,在里面生成一个 profile 的字典变量,然后去更新它,最后返回。代码本身没有什么实际意义,但是用来演示 PySnooper 已经足够。import pysnooperpysnooper.snoop()def demo_fu。

2、nc():profile = profilename = 写代码的明哥profileage = 27profilegender = malereturn profiledef main():profile = demo_func()main()现在我使用终端命令行的方式来运行它rootiswbm # python3 demo.py Source path:. demo.py17:52:49.624943 call 4 def demo_func():17:52:49.625124 line 5 profile = New var:. profile = 17:52:49.625156 line。

3、 6 profilename = 写代码的明哥Modified var:. profile = name: 写代码的明哥17:52:49.625207 line 7 profileage = 27Modified var:. profile = name: 写代码的明哥, age: 2717:52:49.625254 line 8 profilegender = maleModified var:. profile = name: 写代码的明哥, age: 27, gender: male17:52:49.625306 line 10 return profile17:52:49.625344。

4、 return 10 return profileReturn value:. name: 写代码的明哥, age: 27, gender: maleElapsed time: 00:00:00.000486可以看到 PySnooper 把函数运行的过程全部记录了下来,包括:代码的片段、行号等信息,以及每一行代码是何时调用的?函数内局部变量的值如何变化的?何时新增了变量,何时修改了变量。函数的返回值是什么?运行函数消耗了多少时间?而作为开发者,要得到这些如此详细的调试信息,你需要做的非常简单,只要给你想要调试的函数上带上一顶帽子(装饰器) -pysnooper.snoop()即可。3. 详细使。

5、用2.1 重定向到日志文件pysnooper.snoop()不加任何参数时,会默认将调试的信息输出到标准输出。对于单次调试就能解决的 BUG ,这样没有什么问题,但是有一些 BUG 只有在特定的场景下才会出现,需要你把程序放在后面跑个一段时间才能复现。这种情况下,你可以将调试信息重定向输出到某一日志文件中,方便追溯排查。pysnooper.snoop(output=/var/log/debug.log)def demo_func():.2.2 跟踪非局部变量值PySnooper 是以函数为单位进行调试的,它默认只会跟踪函数体内的局部变量,若想跟踪全局变量,可以给pysnooper.snoop(。

6、)加上watch参数out = foo: barpysnooper.snoop(watch=(outfoo)def demo_func():.如此一来,PySnooper 会在outfoo值有变化时,也将其打印出来watch 参数,接收一个可迭代对象(可以是list 或者 tuple),里面的元素为字符串表达式,什么意思呢?看下面例子就知道了pysnooper.snoop(watch=(outfoo, foo.bar, self.foobar)def demo_func():.和watch相对的,pysnooper.snoop()还可以接收一个函数watch_explode,表示除了这几个参数。

7、外的其他所有全局变量都监控。pysnooper.snoop(watch_explode=(foo, bar)def demo_func():.2.3 设置跟踪函数的深度当你使用 PySnooper 调试某个函数时,若该函数中还调用了其他函数,PySnooper 是不会傻傻的跟踪进去的。如果你想继续跟踪该函数中调用的其他函数,可以通过指定depth参数来设置跟踪深度(不指定的话默认为 1)。pysnooper.snoop(depth=2)def demo_func():.2.4 设置调试日志的前缀当你在使用 PySnooper 跟踪多个函数时,调试的日志会显得杂乱无章,不方便查看。在这种情况下,。

8、PySnooper 提供了一个参数,方便你为不同的函数设置不同的标志,方便你在查看日志时进行区分。pysnooper.snoop(output=/var/log/debug.log, prefix=demo_func: )def demo_func():.效果如下2.5 设置最大的输出长度默认情况下,PySnooper 输出的变量和异常信息,如果超过 100 个字符,被会截断为 100 个字符。当然你也可以通过指定参数 进行修改pysnooper.snoop(max_variable_length=200)def demo_func():.您也可以使用max_variable_length=N。

9、one它从不截断它们。pysnooper.snoop(max_variable_length=None)def demo_func():.2.6 支持多线程调试模式PySnooper 同样支持多线程的调试,通过设置参数thread_info=True,它就会在日志中打印出是在哪个线程对变量进行的修改。pysnooper.snoop(thread_info=True)def demo_func():.效果如下2.7 自定义对象的格式输出pysnooper.snoop()函数有一个参数是custom_repr,它接收一个元组对象。在这个元组里,你可以指定特定类型的对象以特定格式进行输出。这边我举个。

10、例子。假如我要跟踪 person 这个 Person 类型的对象,由于它不是常规的 Python 基础类型,PySnooper 是无法正常输出它的信息的。因此我在pysnooper.snoop()函数中设置了custom_repr参数,该参数的第一个元素为 Person,第二个元素为print_persion_obj函数。PySnooper 在打印对象的调试信息时,会逐个判断它是否是 Person 类型的对象,若是,就将该对象传入print_persion_obj函数中,由该函数来决定如何显示这个对象的信息。class Person:passdef print_person_obj(obj):。

11、return fpysnooper.snoop(custom_repr=(Person, print_person_obj)def demo_func():.完整的代码如下import pysnooperclass Person:passdef print_person_obj(obj):return fpysnooper.snoop(custom_repr=(Person, print_person_obj)def demo_func():person = Person()person.name = 写代码的明哥person.age = 27person.gender = maleretur。

12、n persondef main():profile = demo_func()main()运行一下,观察一下效果。如果你要自定义格式输出的有很多个类型,那么custom_repr参数的值可以这么写pysnooper.snoop(custom_repr=(Person, print_person_obj), (numpy.ndarray, print_ndarray)def demo_func():.还有一点我提醒一下,元组的第一个元素可以是类型(如类名Person 或者其他基础类型 list等),也可以是一个判断对象类型的函数。也就是说,下面三种写法是等价的。# 【第一种写法】pysnoop。

13、er.snoop(custom_repr=(Person, print_persion_obj)def demo_func():.# 【第二种写法】def is_persion_obj(obj):return isinstance(obj, Person)pysnooper.snoop(custom_repr=(is_persion_obj, print_persion_obj)def demo_func():.# 【第三种写法】pysnooper.snoop(custom_repr=(lambda obj: isinstance(obj, Person), print_persion_obj)def demo_func(。

 类似资料: