详解DeBug Python神级工具PySnooper


Posted in Python onJuly 03, 2019

PySnooper 在 GitHub 上自嘲是一个“乞丐版”调试工具(poor man's debugger)。

一般情况下,在编写 Python 代码时,如果想弄清楚为什么 Python 代码没有按照预期执行、哪些代码在运行哪些没在运行、局部变量又是什么,我们会使用包含断点和观察模式等功能的调试器,或者直接使用 print 语句打印出来。

但上面的方法都比较麻烦,例如使用调试器需要进行繁琐的设置,使用 print 打印也要很仔细。与它们相比,使用 PySnooper 只需为要调试的函数添加一个装饰器即可,这样就能获得运行函数详细的 log,包括执行的代码行和执行时间,以及局部变量发生变化的确切时间。

之所以称为“乞丐版”,相信是因为 PySnooper 使用起来十分简单,开发者可以在任何庞大的代码库中使用它,而无需进行任何设置。只需添加装饰器,并为日志输出地址指定路径。

GitHub项目地址

安装

pip3 install pysnooper
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

PySnooper特征

如果标准错误输出难以获得,或者太长了,那么可以将输出定位到本地文件:

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

查看一些非本地变量的值:

@pysnooper.snoop(variables=('foo.bar', 'self.whatever'))

展示我们函数中调用函数的 snoop 行:

@pysnooper.snoop(depth=2)

将所有 snoop 行以某个前缀开始,更容易定位和找到:

@pysnooper.snoop(prefix='ZZZ ')

更可以用来获取TensorFlow 的各种张量信息,十分强大。妈妈再也不用担心我找不到bug啦!
(2019.5.7更新:有时会不起作用,不知是自己姿势不对还是其他原因。)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模块学习 re 正则表达式
May 19 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
Cpy和Python的效率对比
Mar 20 Python
《Python之禅》中对于Python编程过程中的一些建议
Apr 03 Python
Python中List.index()方法的使用教程
May 20 Python
python交互式图形编程实例(三)
Nov 17 Python
使用python为mysql实现restful接口
Jan 05 Python
详解用Python实现自动化监控远程服务器
May 18 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Jul 04 Python
python同步windows和linux文件
Aug 29 Python
python DataFrame转dict字典过程详解
Dec 26 Python
python使用多线程+socket实现端口扫描
May 28 Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 #Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 #Python
在cmd中查看python的安装路径方法
Jul 03 #Python
python动态进度条的实现代码
Jul 03 #Python
OpenCV 轮廓检测的实现方法
Jul 03 #Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 #Python
Python Pandas数据结构简单介绍
Jul 03 #Python
You might like
WINXP下apache+php4+mysql
2006/11/25 PHP
php email邮箱正则
2008/10/08 PHP
PHP 数组入门教程小结
2009/05/20 PHP
windows7下安装php的imagick和imagemagick扩展教程
2014/07/04 PHP
php通过Chianz.com获取IP地址与地区的方法
2015/01/14 PHP
php外部执行命令函数用法小结
2016/10/11 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
微信小程序 less文件编译成wxss文件实现办法
2016/12/05 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
2017/09/26 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
解决vue侦听器watch,调用this时出现undefined的问题
2020/10/30 Javascript
python检测远程服务器tcp端口的方法
2015/03/14 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
解读python logging模块的使用方法
2018/04/17 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python文件操作之批量修改文件后缀名的方法
2018/08/10 Python
python将视频转换为全字符视频
2019/04/26 Python
客户代表自我评价范例
2013/09/24 职场文书
经贸日语毕业生自荐信
2013/11/03 职场文书
校长四风对照检查材料
2014/09/27 职场文书
社区活动总结范文
2015/05/07 职场文书
女性健康讲座主持词
2015/07/04 职场文书
2015年征兵工作总结
2015/07/23 职场文书
医院感染管理制度
2015/08/05 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
工作简历的自我评价
2019/05/16 职场文书
golang中的空接口使用详解
2021/03/30 Python
在Docker容器中部署SQL Server
2022/04/11 Servers