详解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实现在控制台输入密码不显示的方法
Jul 02 Python
python处理数据,存进hive表的方法
Jul 04 Python
python获取交互式ssh shell的方法
Feb 14 Python
PyQt5实现简易计算器
May 30 Python
selenium+python环境配置教程详解
May 28 Python
Django  ORM 练习题及答案
Jul 19 Python
Python解决pip install时出现的Could not fetch URL问题
Aug 01 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
wxPython实现文本框基础组件
Nov 18 Python
python小项目之五子棋游戏
Dec 26 Python
Python图像处理库PIL中图像格式转换的实现
Feb 26 Python
Python如何实现后端自定义认证并实现多条件登陆
Jun 22 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
在线竞拍系统的PHP实现框架(二)
2006/10/09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
2006/12/13 PHP
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php中yii框架实例用法
2020/12/22 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
js技巧--转义符"\"的妙用
2007/01/09 Javascript
jquery中EasyUI使用技巧小结
2015/02/10 Javascript
jQuery无刷新分页完整实例代码
2015/10/27 Javascript
javascript中闭包(Closure)详解
2016/01/06 Javascript
jQuery实现的简单百分比进度条效果示例
2016/08/01 Javascript
原生JS实现匀速图片轮播动画
2016/10/18 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
2018/02/26 Javascript
深入Vue-Router路由嵌套理解
2018/08/13 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
[02:28]DOTA2 2015国际邀请赛中国区预选赛首日现场百态
2015/05/26 DOTA
python进程管理工具supervisor使用实例
2014/09/17 Python
深入理解Python装饰器
2016/07/27 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
Python字典循环添加一键多值的用法实例
2019/01/20 Python
如何通过python画loss曲线的方法
2019/06/26 Python
python time.sleep()是睡眠线程还是进程
2019/07/09 Python
深入了解Python在HDA中的应用
2019/09/05 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
深入了解Python 变量作用域
2020/07/24 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
自主招生自荐信指南
2014/02/04 职场文书
函授毕业个人自我评价
2014/02/20 职场文书
让子弹飞观后感
2015/06/11 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers