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

    文章

    4556

    浏览量

    66772
  • 调试器
    +关注

    关注

    1

    文章

    288

    浏览量

    23410
  • DEBUG
    +关注

    关注

    3

    文章

    83

    浏览量

    19447
收藏 人收藏

    评论

    相关推荐

    如何利用SoPC设计通用在线调试器

    变硬件条件下,通过下载针对特定嵌入式芯片的调试“核”来实现对不同嵌入式芯片的仿真调试,但是非常昂贵,难以适应国内绝大多数中小企业的实际需求。SOPC技术将传统的在线调试器以芯片形式呈现
    发表于 08-01 07:44

    调试器能用SWD下载,为什么有些调试器还要带虚拟串口?

    新手请教下,淘宝买了stlink能 运行SWD和JTAG,SWD能下载。为什么有些其它的调试器在支持SWD的情况下还要带虚拟串口来下
    发表于 08-07 11:46

    arm调试器有哪些应用范围

    自己用过的arm调试器经历了四阶段单片机使用的调试器,玩stm32 过程中使用调试器下载程序时在网上买了st-link 的
    发表于 07-16 07:58

    如何自制基于jlink的无线调试器

    如何自制基于jlink的无线调试器
    发表于 01-18 06:47

    蓝牙调试器的相关资料推荐

    蓝牙调试器这篇文章的受众是本专科院校有理想的青年或已经踏入社会的电子工程师们。本文章旨在介绍款在Android设备上通过使用蓝牙功能实现无线调试的应用。、蓝牙
    发表于 01-20 06:32

    分享功能强大的APP蓝牙调试器

    数据发送到上位机,省去了串口连线到电脑的步骤。今天分享功能强大的APP,蓝牙调试器,它具备以下功能发送/接收蓝牙串口的数据自定义蓝牙串口 发送/接收数据包格式支持多种控件:如按键,文本,滑动窗口,坐标轴显示等。尤其是自定义数
    发表于 02-22 06:03

    【沁恒微CH32V307评估板试用体验】重制WCH-Link调试器

    方便,查看到网上有不少人都是自己DIYWCH-Link调试器,因此我也在淘宝上买了CH549芯片,自己画了小板子自制了
    发表于 07-17 18:23

    基于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>

    逻辑调试器link-logic

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

    串口/网络数据调试器

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

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

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

    PySnooper :一个非常方便调试器

    PySnooper 是一个非常方便调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟Debug工具,但是许多Debug工
    的头像 发表于 10-17 17:12 235次阅读
    <b class='flag-5'>PySnooper</b> :一个<b class='flag-5'>非常</b><b class='flag-5'>方便</b>的<b class='flag-5'>调试器</b>

    PySnooper:替代print的重复性工作

    PySnooper 是一个非常方便调试器。如果您正在试图弄清楚为什么您的Python代码没有按照您的预期去做,您会希望使用具有断点和监视功能的成熟Debug工具,但是许多Debug工
    的头像 发表于 10-30 10:41 188次阅读