0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PySnooper:一个非常方便的调试器

科技绿洲 来源:Python实用宝典 作者:Python实用宝典 2023-10-31 11:16 次阅读

PySnooper 是一个非常方便的调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟Debug工具,但是许多Debug工具配置起来非常麻烦。

现在,有了PySnooper,您并不需要配置那么复杂的Debug工具,就能够完成对整个代码的分析。它能告诉您哪些代码正在运行,以及局部变量的值是什么。

其实,PySnooper 就是替代了一行一行print的重复性工作,给你的代码一个pysnooper装饰器,它能自动识别到语句和变量并将其值print出来:

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)

效果如下:

Source path:... 1.py
Starting var:.. number = 6
23:03:35.990701 call         4 def number_to_bits(number):
23:03:35.991699 line 5     if number:
23:03:35.991699 line 6         bits = []
New var:....... bits = []
23:03:35.991699 line 7         while number:
23:03:35.991699 line 8             number, remainder = divmod(number, 2)
Modified var:.. number = 3
New var:....... remainder = 0
23:03:35.991699 line 9             bits.insert(0, remainder)
Modified var:.. bits = [0]
23:03:36.004664 line 7         while number:
23:03:36.005661 line 8             number, remainder = divmod(number, 2)
Modified var:.. number = 1
Modified var:.. remainder = 1
23:03:36.005661 line 9             bits.insert(0, remainder)
Modified var:.. bits = [1, 0]
23:03:36.007657 line 7         while number:
23:03:36.007657 line 8             number, remainder = divmod(number, 2)
Modified var:.. number = 0
23:03:36.008655 line 9             bits.insert(0, remainder)
Modified var:.. bits = [1, 1, 0]
23:03:36.008655 line 7         while number:
23:03:36.009651 line 10         return bits
23:03:36.009651 return      10         return bits
Return value:.. [1, 1, 0]
Elapsed time: 00:00:00.020945

可以看到,它将每一行变量的值都输出到屏幕上,方便你调试代码。

仅仅需要写一行代码—使用装饰器就可以实现这个方便的调试功能,比起一行行写print,这可方便多了。

0.安装模块

使用这个模块,你只需要使用Pip安装PySnooper:

pip install pysnooper

接下来讲讲这个模块其他好用的功能:

1.支持日志文件

如果你觉得print到屏幕上不方便,还可以将其输出到log文件中,你只需要将装饰器那一行改为:

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

2.读取局外变量或其他表达式

如果你想读取在装饰器作用范围以外的变量或者表达式的值,还可以使用watch参数

@pysnooper.snoop(watch=('foo.bar', 'self.x["whatever"]'))

3.如果你不想用装饰器,也可以用上下文的形式调试

没错,装饰器有限定的使用条件,使用起来比较局限,因此pysnooper还支持使用 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:....... i = 9
New var:....... lst = [681, 267, 74, 832, 284, 678, ...]
09:37:35.881721 line 10         lower = min(lst)
New var:....... lower = 74
09:37:35.882137 line 11         upper = max(lst)
New var:....... upper = 832
09:37:35.882304 line 12         mid = (lower + upper) / 2
74 453.0 832
New var:....... mid = 453.0
09:37:35.882486 line 13         print(lower, mid, upper)
Elapsed time: 00:00:00.000344

当我们只需要调试部分代码的时候,这个上下文形式的调试方法非常方便。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68591
  • 调试器
    +关注

    关注

    1

    文章

    305

    浏览量

    23739
  • DEBUG
    +关注

    关注

    3

    文章

    94

    浏览量

    19915
收藏 人收藏

    评论

    相关推荐

    基于SoPC的通用在线调试器设计

    目前,国内生产的部分在线仿真调试器可以对部分嵌入式芯片进行仿真调试。但从本质上,这些仿真调试器无法对所有带在线调试功能的嵌入式芯片进行仿真调试
    发表于 01-16 11:02 885次阅读
    基于SoPC的通用在线<b class='flag-5'>调试器</b>设计

    串口通讯调试器工具 -下载

    串口通讯调试器工具 -下载:是款功能灵活,操作方便的串口调试程序。适用于Win9X/2000系统平台,可有效的提高串口程序的开发效率,免除工控软件及单片机开发人员的串口调
    发表于 05-26 08:59 63次下载

    基于DCC和JTAG的ARM硬件仿真调试器的研究与实现

    嵌入式系统开发是当今计算机软件发展的热点。嵌入式系统调试器是进行嵌入式开发的关键工具,常用于对嵌入式软件的调试和测试。嵌入式系统调试器
    发表于 10-27 16:27 56次下载

    基于CodeWarrior集成开发环境的调试器原理

    本文首先阐述了调试器设计的基本原理,调试器的类型,调试器的结构等基本概念。然后介绍了断点设置,单步跟踪,执行控制和符号表读写的原理;以及硬件和操作系统对跟踪调试
    发表于 12-27 15:31 65次下载
    基于CodeWarrior集成开发环境的<b class='flag-5'>调试器</b>原理

    调试器模块(可按键调试

    飞思卡尔单片机 调试器模块(可按键调试)源程序
    发表于 01-13 15:18 11次下载

    使用在PICkit™ 3线调试器

    使用在PICkit™ 3线调试器
    发表于 09-22 14:53 5次下载
    使用在PICkit™ 3线<b class='flag-5'>调试器</b>

    gdb调试器解析

    3.4 gdb调试器 调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好、更快地定位程序中的问题从而加快程序开发的进度,是大家都很关注的问题。就如读者熟知的Windows下的
    发表于 10-18 13:49 1次下载

    Microchip 调试器(MDB) 用户指南

    Microchip 调试器(MDB) 用户指南
    发表于 05-25 17:29 8次下载

    Microchip调试器(MDB)用户指南

    Microchip调试器(MDB)是Microchip硬件和软件开发工具的命令行调试器接口。作为Microchip MPLAB® X集成开发环境(Integrated Development Environment,IDE)图形界面的替代,MDB通过命令提示符接口来
    发表于 05-12 09:46 19次下载

    逻辑调试器link-logic

    logic,用于调试带SWD接口的单片机、以及带有逻辑分析仪。是美观、小巧、功能全的逻辑分析仪调试器。实物展示优点小巧、多功能插针隐藏设计、
    发表于 01-12 20:21 9次下载
    逻辑<b class='flag-5'>调试器</b>link-logic

    串口/网络数据调试器

    串口/网络数据调试器
    发表于 05-09 14:59 1次下载

    智嵌物联USB-CAN调试器使用方法介绍

    技术人员在开发调试CAN总线时,往往需要分析CAN报文数据,这时就需要PC机上的CAN调试器了。智嵌物联ZQWL研发的CAN调试器使用方便
    的头像 发表于 02-25 15:04 1772次阅读
    智嵌物联USB-CAN<b class='flag-5'>调试器</b>使用方法介绍

    Microchip调试器(MDB)用户指南

    Microchip调试器(MDB)是Microchip硬件和软件开发工具的命令行调试器接口。作为Microchip MPLAB® X集成开发环境(Integrated Development Environment,IDE)图形界面的替代,MDB通过命令提示符接口来
    发表于 09-22 17:53 0次下载
    Microchip<b class='flag-5'>调试器</b>(MDB)用户指南

    PySnooper非常方便调试器

    PySnooper非常方便调试器。如果您正在试图弄清楚为什么您的Python代码没有按
    的头像 发表于 10-17 17:12 467次阅读
    <b class='flag-5'>PySnooper</b> :<b class='flag-5'>一</b><b class='flag-5'>个</b><b class='flag-5'>非常</b><b class='flag-5'>方便</b>的<b class='flag-5'>调试器</b>

    PySnooper:替代print的重复性工作

    PySnooper非常方便调试器。如果您正在试图弄清楚为什么您的Python代码没有按
    的头像 发表于 10-30 10:41 408次阅读