首页 > 编程语言 >Python代码调试方法

Python代码调试方法

时间:2022-10-04 10:34:06浏览次数:57  
标签:函数 snoop Python 代码 pysnooper person test 调试

对于每个程序开发者来说,调试几乎是必备技能。常用Pycharm编辑器里的方法有Print大法、log大法,但缺少类似Matlab的变量区,给代码调试带来不便,特别是在有函数的情况下,变量无法实时查看。


1、Python Console

在Pycharm编辑器里面有个Python Console,可以查看变量变化,但对于函数变量难调试。

Python代码调试方法_局部变量



2、PySnooper

安利一款非常好用的调试工具,它能在一些场景下,大幅度提高调试的效率, 那就是 PySnooper

2.1、快速安装

执行下面这些命令进行安装 PySnooper

pip install pysnooper

2.2、简单案例

下面这段代码,定义了一个 test 的函数,在里面生成一个 person 的字典变量,然后去更新它,最后返回。

import pysnooper

@pysnooper.snoop()def test(): person = {} person["name"] = "domi" person["age"] = 28 person["gender"] = "male" return person

def main(): author = test()

main()

输出结果

21:25:21.875841 call         5 def test():21:25:21.875841 line         6     person = {}New var:....... person = {}21:25:21.875841 line         7     person["name"] = "domi"Modified var:.. person = {'name': 'domi'}21:25:21.876840 line         8     person["age"] = 28Modified var:.. person = {'name': 'domi', 'age': 28}21:25:21.876840 line         9     person["gender"] = "male"Modified var:.. person = {'name': 'domi', 'age': 28, 'gender': 'male'}21:25:21.876840 line        10     return person21:25:21.876840 return      10     return personReturn value:.. {'name': 'domi', 'age': 28, 'gender': 'male'}Elapsed time: 00:00:00.000999

PySnooper 把函数运行的过程全部记录了下来,包括:

  • 代码的片段、行号等信息,以及每一行代码是何时调用的?
  • 函数内局部变量的值如何变化的?何时新增了变量,何时修改了变量。
  • 函数的返回值是什么?
  • 运行函数消耗了多少时间?


2.3、重定向到日志文件

@pysnooper.snoop() 不加任何参数时,会默认将调试的信息输出到标准输出。对于单次调试就能解决的 BUG ,这样没有什么问题,但是有一些 BUG 只有在特定的场景下才会出现,需要你把程序放在后面跑个一段时间才能复现。这种情况下,你可以将调试信息重定向输出到某一日志文件中,方便追溯排查。

@pysnooper.snoop(output='./debug.log')def test():

2.4、跟踪非局部变量值

PySnooper 是以函数为单位进行调试的,它默认只会跟踪函数体内的局部变量,若想跟踪全局变量,可以给 pysnooper.snoop() 加上 watch 参数

out = {"foo": "bar"}@pysnooper.snoop(watch=('out["foo"]'))def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    out["foo"] += 'test'    return person

Python代码调试方法_局部变量_02

2.5、设置跟踪函数的深度

当你使用 PySnooper 调试某个函数时,若该函数中还调用了其他函数,PySnooper 是不会傻傻的跟踪进去的。如果你想继续跟踪该函数中调用的其他函数,可以通过指定 depth 参数来设置跟踪深度(不指定的话默认为 1)。

@pysnooper.snoop()def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    c = test1()    return person

def test1(): a = 1 b = 2 return a + b

Python代码调试方法_多线程_03

@pysnooper.snoop(depth=2)

Python代码调试方法_重定向_04

2.6、设置调试日志的前缀

当你在使用 PySnooper 跟踪多个函数时,调试的日志会显得杂乱无章,不方便查看。在这种情况下,PySnooper 提供了一个参数,方便你为不同的函数设置不同的标志,方便你在查看日志时进行区分。

@pysnooper.snoop(output="./debug.log", prefix="test: ")def test():    person = {}    person["name"] = "domi"    person["age"] = 28    person["gender"] = "male"    c = test1()    return person

@pysnooper.snoop(output="./debug.log", prefix="test1: ")def test1(): a = 1 b = 2 return a + b

Python代码调试方法_局部变量_05

2.7、支持多线程调试模式

PySnooper 同样支持多线程的调试,通过设置参数 thread_info=True,它就会在日志中打印出是在哪个线程对变量进行的修改。

@pysnooper.snoop(thread_info=True)

Python代码调试方法_多线程_06

标签:函数,snoop,Python,代码,pysnooper,person,test,调试
From: https://blog.51cto.com/domi/5731097

相关文章

  • python 批量删除超过某时长的视频 (改)
    importos.pathfrommoviepy.editorimportVideoFileClipfromtqdmimporttqdmdefget_file_names(path):return[os.path.join(path,f)forfinos.listdir(......
  • python partition函数_Python partition()函数的使用方法
    一、partition()函数的语法格式string_name.partition(separator)(1)string_name为要被分隔的字符串或字符串变量。(2)该函数有一个字符串类型的参数:separator,该参数用于指......
  • 代码随想录训练营|Day 14|Binary Tree, 144, 145, 94
    BinaryTrees树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)......
  • 代码随想录训练营|Day 13|150,239,347,总结
    150.EvaluateReversePolishNotationEvaluatethevalueofanarithmeticexpressionin ReversePolishNotation.Validoperatorsare +, -, *,and /.Each......
  • 学习笔记:python字符串的处理方法
    python学习字符串处理方法1.str.lower()和str.upper()实现全大写和全小写。2.str.split()能够使字符串以一种格式分割开,并返回一个分割完成的列表。3.str.count(x)......
  • 学习笔记;python循环
    python学习1.for循环foriinrange(1,10):print(i)#输出为123456789for循环与列表的结和squares=[]fornumberinrange(1,10):square=......
  • RISC-V指令精讲(一):算术指令实现与调试
    本节来看下RV32I(32位整数指令集)的算数指令,先学习下加减指令(add、sub),接着了解下数值比较指令(slt),这些指令都有两个版本:一个是立即数版本,一个是寄存器版本RISCV-V指令......
  • 惊悉postman可以自动生成接口自动化代码了
    点右上角这里,就可以了,什么语言都有。很方便......
  • Python自动化运维
    更新中.......目录​​第一章基础篇​​​​系统基础信息模块详解​​​​业务服务监控详解​​​​定制业务质量报表详解​​​​Python与系统安全​​​​第二章高级篇......
  • Python从入门到放弃
    目录​​第一章Markdown编辑器​​​​第二章计算机基础知识​​​​第三章进入python世界(基础)​​​​第四章面向对象编程​​​​第五章网络编程​​​​第六章并......