再见Print,用这个更香!

小编学习使用Python已经有5-6年啦,使用 Python 开发过程中,总是避免不了 Debug。小伙伴们,你们都怎样 Debug Python 代码,是不是常用 print 大法?

在本文介绍的这个项目中,Debug Python 代码再也不需要 print 了。只要给有疑问的代码加上装饰器,各种信息一目了然,找出错误也就非常简单了。

这个名为 PySnooper 的项目在 GitHub 上已经收获了13.9K+ 的 Star 量 。它类似于有断点和监视功能的调试器。

01 如何安装

安装 PySnooper 的最佳方法是使用 pip:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">pip install pysnooper</pre>

02 简单案例介绍

该工具使用采用装饰器的形式,将函数的运行过程以日志的形式进行输出,其记录了运行了哪些代码行,运行的时间及运行到当前代码时各变量的值。

代码运行详细信息如下:

可以看到 PySnooper 把整个函数运行的过程都记录了下来,包括:
1).代码文件所在路径、代码行号等信息,以及每一行代码调用时间信息
2).函数内局部变量 gzh_dict 的值
3).函数的 return 返回值
4).函数运行的整个时间
如果不想跟踪整个函数,则可以将相关部分包装在 with 块中:

代码运行情况如下:

03 5大进阶功能

1).将输出重定向到文件

@pysnooper.snoop() 不传参数时,会将调试的信息输出到标准输出。对于单次调试就能解决的 BUG ,这样没有什么问题,但是有一些 BUG 只有在特定的场景下才会出现,需要你把程序放在后面跑个一段时间才能复现。这种情况下,你可以将调试信息重定向输出到某一日志文件中,方便追溯排查。

2).跟踪全局变量

PySnooper 默认是只跟踪函数体内的局部变量,若需要跟踪全局变量需要给 pysnooper.snoop() 加上参数 watch.

从上可知,如果全局变量 gzh_info 的值有变化时,就会被打印出来。pysnooper.snoop() 还可以接收另外一个参数 watch_explode,和 watch 参数相反,它表示除了这几个参数外的其他所有全局变量都监控。

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">@pysnooper.snoop(watch_explode="gzh_info")</pre>

3).设置调试日志的前缀

当使用 PySnooper 跟踪多个函数时,日志输出会显得很乱,不方便查找文件。对于这种情况,PySnooper 提供了一个参数,方便为不同的函数设置不同的标识,方便在查看日志时进行区分日志属于哪个函数。

4).支持多线程调试模式

PySnooper 同样支持多线程的调试,通过设置参数 thread_info=True ,它就会在日志中打印出函数中对应的线程信息。

5).获得程序执行时间

如果希望输出的时间是相对于程序开始运行的时间,使用relative_time = True 即可。

6).不显示和环境相关的信息

如果只想看代码相关的输出信息,设置 normalize= True 就会删除所有与机器相关的数据(路径,时间戳,内存地址),只显示变量信息:

相对于其他 DEBUG 工具,例如 Pycharm 本地打断点调试,在本地用 IDE 的图形化界面调试无疑是最适合的,但是如果需要调试服务器的Python脚本,并且服务器只能通过堡垒机进行登陆访问, Pycharm 的远程调试就不好用了,PySnooper 的优势就体现出来了。

感兴趣的小伙伴赶紧去试试 PySnooper 吧。

万水千山总是情,点个 👍 行不行。

程序员GitHub,现已正式上线!

接下来我们将会在该公众号上,专注为大家分享GitHub上有趣的开源库包括Python,Java,Go,前端开发等优质的学习资源和技术,分享一些程序员圈的新鲜趣事。

目前wx搜索Python 【菜鸟学Python】排第二,汇聚了30万Python爱好者,累计原创近400篇趣味干货(爬虫,数据分析,算法,面试指南,原创趣味实战,Python游戏,机器学习),欢迎一起学Python,交流指正。

推荐阅读更多精彩内容