Python里三个最高逼格的调试神器

Python-betterexceptions在Python中漂亮和实用的异常 better-exceptions 在Python中漂亮和实用的异常 立即下载

640?wx_fmt=png

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。

1.PDB

pdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演示方便,我们准备一个样例程序pdb_test.py:
def countnumber(number):
  for i in range(number):
    print(i)

if __name__ == '__main__':
  countnumber(10)

之后在终端中输入python -m pdb pdb_test.py命令,进入pdb的调试模式:

640?wx_fmt=png


这时我们就可以通过各种命令控制代码执行或者查看当前变量,例如l可以查看所有代码,n是执行下一步代码,p可以查看当前变量等等,需要注意的是命令n只会执行主程序中的代码,如果想要单步执行子函数中的代码,需要使用s指令,调试效果如下:

640?wx_fmt=png

可以看到,通过s指令(如果只想在主函数中单步执行可以使用n)和p指令,我们控制程序单步运行并实时查看了相关变量。但是单步执行毕竟是一种效率非常低下的调试方式,尤其当代码量比较大的时候更是噩梦,这时就需要用到pdb的set_trace()方法,我们对样例程序pdb_test.py做一点修改:
import pdb
def countnumber(number):
  for i in range(number):
    print(i)
    pdb.set_trace()

if __name__ == '__main__':
  countnumber(10)

pdb.set_trace()的作用就是在代码中设置断点,在pdb调试模式下,使用c命令就会直接跳转到下一个断点位置,如果之后没有其他断点就会执行完全部代码,调试效果如下:

640?wx_fmt=png

除了上面提到的几个指令以外,pdb还有其他一些比较常用的命令(见下表),综合使用基本能够满足日常的调试需求。

640?wx_fmt=png

2.Better-exceptions

better-exceptions是一个Python第三方库,作者对他的定义是“使异常信息更加美观和详尽”。在正式使用之前先说下这个库的安装:
  • 第一步,使用pip install better_exceptions安装better-exceptions库;
  • 第二步,使用export BETTER_EXCEPTIONS=1(Linux / OSX)或setx BETTER_EXCEPTIONS 1(Windows)设置环境变量。
现在就可以正常使用better-exceptions进行调试了,为了演示效果更加明显,我们对上文中的代码稍作修改作为本次的样例程序better_test.py:
def divisionnumber(number, div):
  for i in range(div):
    print(number / i)

if __name__ == '__main__':
  divisionnumber(10, 10)

很明显,上面这段代码在执行过程中会因为分母为0而抛出异常,现在我们执行python better_test.py,看看启用了better-exceptions后的异常信息是什么样子的:

640?wx_fmt=png

从上面这幅图可以看出better-exceptions对异常信息的修改主要体现在两个方面:

  • 一是对产生异常的代码进行了颜色标注;

  • 二是对产生异常的代码中的相关变量值进行了输出(包括函数等对象);

这样一来,很多时候我们只需要根据better-exceptions输出的辅助信息就能判断产生异常的位置和原因,而不必像以前一样再次查看源代码并观察运行结果,正如作者所说:Pretty and more helpful。
但是,过多的信息输出也会有问题,那就是当代码层级结构比较复杂的时候,better-exceptions输出的辅助信息可能会非常之多,就比如上面的divisionnumber函数,他所在的地址信息多数时候我们并不关心,为了屏蔽这些“垃圾”信息,我们可以在代码中加一行:
better_exceptions.MAX_LENGTH = XXX

XXX是允许显示的最大字符长度,比如这里设置为10,再来运行better_test.py这个程序就会是下面的结果:

640?wx_fmt=png

可以看到,对函数divisionnumber的注释只显示了最开始的"<function"这几个字符。
除了上面提到的功能之外,better-exceptions还可以和logging还有django无缝接入,这使得它的应用更加灵活,关于这方面内容大家可以查看项目文档。
还有一点需要提醒大家,如果你是在windows下使用,可能会出现下图中的乱码问题,这是由于better-exceptions的内设编码格式所导致的。

640?wx_fmt=png

解决的办法是在安装后,对better_exceptions目录下的encoding.py文件第10行代码进行如下修改:
# 原代码:
ENCODING = locale.getpreferredencoding()
# 修改为:
ENCODING = 'utf-8'

3.PySnooper

PySnooper也是一个Python的第三方库,他的特点是能够精准的显示每条代码的执行顺序、执行时间以及随之带来的局部变量的改变等等。值得一提的是,作为一个发布不满半年的库,PySnooper在github上已经达到了1.2W星,其受欢迎程度可见一斑。

640?wx_fmt=png

PySnooper的使用可以说是非常的方便,直接在代码中以装饰器的形式调用就可以了。当然在引用前你得使用pip install pysnooper或者conda install -c conda-forge pysnooper安装这个库。我们还是举一个例子来进行演示,样例代码如下:

import pysnooper
import random
@pysnooper.snoop()
def foo():
    lst = []
    for i in range(10):
        lst.append(random.randrange(1, 1000))
    lower = min(lst)
    upper = max(lst)
    mid = (lower + upper) / 2
    print(lower, mid, upper)
foo()

在上面这段代码中,我们先是生成10个1到1000之间的随机数,然后计算他们之中的最大最小值和中位数,唯一的不同在于第三行多了一条语句@pysnooper.snoop(),我们运行以下代码,发现除了正常的print结果之外,多了许多内容(内容太多,下面只显示一部分):
19:51:57.704857 call        16 def foo():
19:51:57.705860 line 17     lst = []
New var:....... lst = []
19:51:57.705860 line 18     for i in range(10):
New var:....... i = 0
19:51:57.705860 line 19         lst.append(random.randrange(1, 1000))
Modified var:.. lst = [758]
19:51:57.705860 line 18     for i in range(10):
Modified var:.. i = 1

....................

19:51:57.706818 line 22     upper = max(lst)
New var:....... upper = 927
19:51:57.706818 line 23     mid = (lower + upper) / 2
New var:....... mid = 552.0
19:51:57.706818 line 24     print(lower, mid, upper)
19:51:57.706818 return      24     print(lower, mid, upper)
Return value:.. None

这都是PySnooper跟踪监控的结果,正如上面所说,他准确记录的每条代码的运行时间、顺序以及相关的变量值。
作为一个星标1.2W+的项目,PySnooper的功能肯定不会这么简单,@pysnooper.snoop()中是可以接收参数的,比如我们觉得输出内容太多,可以考虑把信息记录到log日志中,这个功能只需要加一个log文件定位参数就能搞定:
@pysnooper.snoop('file.log')

@pysnooper.snoop()支持的参数还有很多,分别对应了不同的功能,例如监控自定义表达式、监控底层函数、支持多线程等等,详见项目文档。
此外,pysnooper还支持局部监控,一般来说我们写的代码都比较长,而需要监控的只是其中的一小部分,这时候就可以把需要监控的代码放到一个block里。我们修改下刚才的代码,只对计算最大最小值和中位数的部分进行监控,修改后的代码如下:
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:....... lst = [562, 341, 552, 353, 628, 302, 430, 188, 955, 108]
New var:....... i = 9
20:02:47.359272 line 21       lower = min(lst)
New var:....... lower = 108
20:02:47.359272 line 22       upper = max(lst)
New var:....... upper = 955
20:02:47.360269 line 23       mid = (lower + upper) / 2

使用with pysnooper.snoop()模式依然保留了对各种参数的支持,个人认为这种模式更加符合实践需求。


小结:
今天介绍了三个不借助IDE就能方便使用的调试工具,三个工具的调试思路和适用场景也各不相同,大家可以根据需要灵活选用。不过话说回来,我个人最喜欢的还是PySnooper,你最喜欢哪一款呢?

近期热门:

零基础必读热门:



better-exceptions:Python中漂亮而有用的异常 更好的例外 Python中的漂亮,更有用的异常。 用法 通过pip安装better_exceptions : $ pip install better_exceptions 并将BETTER_EXCEPTIONS环境变量设置为任何值: export BETTER_EXCEPTIONS=1 # Linux / OSX setx BETTER_EXCEPTIONS 1 # Windows 而已! Python REPL(交互式Shell) 为了在Python REPL中使用better_exceptions ,请首先安装该软件包(按照上述说明)并运行: $ python -m better_exceptions Type "help", "copyright", "credits" or "license" for more information. (BetterExc 立即下载

相关推荐

智能座舱架构与芯片 - (3) 硬件篇 上

在了解智能座舱的基本架构之后,我们有必要针对智能座舱域的硬件平台,软件平台,SOC等进行逐一介绍。从它们的整体结构中去认识最新的智能座舱组成部件,以及主要功能等。如上图,是中央计算-区域控制架构下的智能座舱硬件平台框架图,其中,智能座舱控制器CDC挂载在以太网交换机上,与其他车控域VDC,自驾域ADC,网联设备5G+V2X等通过以太网实现数据交互。而智能座舱域的外部硬件设备还包含有连接子系统音频子系统摄像头子系统显示子系统存储子系统功能安全子系统等。

joanna_xiao的博客 2403

python better-exceptions工具

python debug 工具 better-exceptions 安装方法 # install pip install better_exceptions # set the BETTER_EXCEPTIONS environment variable to any value export BETTER_EXCEPTIONS=1 # Linux / OSX setx BETTER_EXCE...

YahamaTarGe的博客 2609

如何用Python分析20年投资者情绪数据(附ISI和CICSI完整数据集)

本文提供了一份利用Python分析2003-2023年投资者情绪数据的实战指南。文章详细介绍了如何获取并清洗ISI和CICSI数据集,运用Pandas、Matplotlib等工具进行数据探索、可视化与深度分析,包括趋势分解、成分关联及情绪状态划分,旨在帮助读者掌握从数据到洞察的完整流程,为量化金融研究提供方法论支持。

gpu4optimizer的博客 469

python使用神器_Python里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演...

weixin_39520013的博客 187

农业AI避坑指南:用YOLO11做叶片病害检测时遇到的5个典型问题

本文分享了使用YOLO11模型进行农业叶片病害检测时常见的五个典型问题及解决方案。针对田间多变光照、病害样本不均衡、标注歧义、背景干扰和边缘部署等挑战,提供了包括场景自适应数据增强、解耦训练、软标签与鲁棒损失函数、困难负样本构建以及模型轻量化部署在内的实战经验,旨在帮助开发者提升农业AI项目的落地效果。

ujm56789012的博客 206

从零上手HiAgent:构建能听懂指令的智能体框架实战指南

智能体(Agent)作为人工智能领域的重要范式,正从传统的预设流程自动化转向以目标驱动的自主规划与执行。其核心原理在于利用大语言模型(LLM)作为决策大脑,通过任务规划、工具调用与记忆机制,将模糊的自然语言指令转化为可执行的工作流。这一技术显著提升了人机协作的效率和自然度,其价值在自动化办公、数据分析与智能流程编排等场景中尤为突出。本文聚焦于HiAgent这一具体框架,深入解析其作为智能体开发平台的核心架构,涵盖规划器、执行器、工具集等关键组件,并提供从环境配置、自定义工具开发到复杂任务链构建的完整工程实践

weixin_29266007的博客 890

**更优异常处理:让Python的错误变得更好看且更有帮助**

在开发过程中,我们经常遇到各式各样的异常情况,而如何优雅地处理这些异常,不仅考验着代码的质量,也直接影响到问题排查的效率。今天,我要向大家推荐一款开源库——`better-exceptions`,它将改变你对Python异常的认知。 ## 项目介绍 `better-exceptions`是一个轻量级的库,旨在美化和增强Python中的异常信息展示,通过自动化的配置让开发者能够更直观、快速地定位...

gitblog_00010的博客 414

opencv 常用函数总结

本文是一份OpenCV图像处理的常用函数总结,详细介绍了图像的读入、显示、保存、像素处理、图像属性获取、基础操作、阈值处理、图像平滑、形态学转换以及直方图处理等关键技术。文章通过代码示例和参数说明,帮助读者快速掌握OpenCV在图像处理领域的应用。

weixin_44063529的博客 1600

Better Exceptions故障排除手册:解决所有常见问题的完整方案

Python开发中遇到难以理解的错误信息?**Better Exceptions**作为终极Python错误增强工具,通过直观的可视化界面和详细变量信息,让故障排除变得简单高效。本文将提供完整的Better Exceptions解决方案,帮助您快速解决所有常见问题。 ## 🔧 什么是Better Exceptions? Better Exceptions是一个开源的Python库,专门用于增

gitblog_00298的博客 684

Windows非分页缓冲池内存泄漏实战:PoolMon与RAMMap高效排查指南

本文详细介绍了Windows系统中非分页缓冲池内存泄漏的实战排查方法。当系统出现卡顿且内存占用异常增长时,通过RAMMap工具快速定位非分页缓冲池异常,并利用PoolMon监控内核内存分配标签,精准锁定泄漏源。文章提供了从确认症状、安装工具到使用findstr命令溯源驱动文件的完整五步排查流程,并总结了常见泄漏标签与解决方案,帮助用户高效解决深层系统内存问题。

weixin_28455801的博客 1011

实战封神!YOLOv7 轻量化部署全攻略:ONNX格式转换+TensorRT极致加速(速度直接提升3-5倍,精度无损)

部署核心链路,这是YOLO系列部署的最优解,速度提升3~5倍,精度无损;ONNX是桥梁:解决模型兼容性问题,简化后能去掉冗余节点,是TensorRT加速的前提;TensorRT是核心:NVIDIA显卡的极致加速引擎,FP16量化是速度与精度的最优平衡,无需手动配置,一键开启;轻量化终极组合YOLOv7-tiny + 416尺寸 + TensorRT FP16,速度提升5~8倍,满足所有实时检测场景;避坑核心:转换参数必加,推理尺寸必须一致,engine文件显卡专属。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 308

python代码异常对照表格_【干货分享】python异常助手之better-exceptions

阅读:916better-exceptions 可以在python异常发生时显示更多信息,帮助我们更好的发现问题.简介介绍这个库前,我们先看一个简单的例子(example.py),代码如下:# -*- encoding: utf-8 -*-def get_student_infos(logs):student_infos = []for log in logs:name, catgory, gra...

weixin_39588432的博客 637

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python 里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三...

苏克的博客 542

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

python调试神器_Python里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演...

weixin_39915267的博客 335

python pdb调试多进程_Python里三个最高逼格的调试神器

原标题:Python里三个最高逼格的调试神器 调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用p...

weixin_39530269的博客 1322

qdebug 调试 输出乱码_Python里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调...

weixin_39938935的博客 324

python 怎么用mad函数_Python里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演...

weixin_32473663的博客 661

python代码格式化神器_Python里三个最高逼格的调试神器!你用过哪个呢?

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演...

weixin_39794213的博客 118

delphi 单步调试 不显示变量值_Python里三个最高逼格的调试神器

原创: 大刘 菜鸟学Python调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代...

weixin_28839439的博客 261

delphi 单步调试 不显示变量值_Python 里三个最高逼格的调试神器

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调...

weixin_39553757的博客 172

delphi 单步调试 不显示变量值_Python里三个最高逼格的调试神器!你用过哪个呢?...

调试是开发过程中不可避免的一个环节,在Python中我们使用print、logging、assert等方法进行调试既简单又实用,但毕竟有其局限性。今天这篇文章为大家带来三个工具,其中有Python的内置模块也有第三方库,它们提供了调试代码所需的大部分常用功能,将极大的提升我们的开发和bug排除效率。1.PDBpdb是Python中的一个内置模块,启用pdb后可以对代码进行断点设置和跟踪调试。为了演...

weixin_39568889的博客 101

python logging模块_python调试神器pysnooper的使用方法

Print也许是Python中使用频率最高的一个函数。很多小白都是从Hello World程序开始认识Python,而Python的Hello World程序只有一行,那就是调用内置的Print函数,向控制台输出字符串“Hello World”。不仅小白,哪怕是Python开发者,通常也是Print函数的重度用户。Print最大的应用场景,便是用于调试Python程序。比如,用Print打印程序的...

weixin_39689506的博客 150

python逐行调试_python单步调试

广告关闭腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!本文由腾讯云+社区自动同步,原文地址 https:stackoverflow.clubpython-debug python pdb 使用 使用命令 python -m pdbyour_py_file 进入调试界面,输入 help pdb可以查询完整帮助信息 执行命令行debug p...

weixin_39968852的博客 675
上一篇: 私藏多年的Markdown编辑器,全部分享给你
下一篇: 马斯克推出史上最强宇宙飞船!2个月内试飞,可载100人长期星际旅行,还发布火星城市构想...
菜鸟学Python
博客等级 码龄9年 8063粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值