python 调试冷知识(小结)
对于python代码的调试我们通常都是使用IDE自带的调试功能。但是IDE提供的调试功能存在局限性,例如在测试服务器上调试代码,但是又不可能在测试服务器上安装IDE进行调试。这时我们就可以利用下面所讲解的三个工具进行调试。
零、准备调试代码
在讲解三个调试工具前,我们先编写待调试的代码。代码很简单,就是计算两个数的商。我们在编写代码的时候故意留下了除数为0的bug。
defdivision(start,end): foriinrange(start,end,-1): num1=i num2=i-1 result=num1/num2 print(result) if__name__=='__main__': division(10,0)
一、PySnooper
PySnooper是Python的第三方工具库,它可以精确的显示代码的执行时间、执行顺序和代码中的局部变量值的变化等。PySnooper使用方法很简单,只需要将它作为装饰器来使用即可。下面我们来看一下具体使用步骤:
安装PySnooper
1.在控制台输入如下命令:
pipinstallpysnooper
等待两秒钟后PySnooper安装完成。
2.加入PySnooper
首先需要引入PySnooper
importpysnooper
接着在需要测试的函数上加上pysnooper装饰器
@pysnooper.snoop() defdivision(start,end): foriinrange(start,end,-1): num1=i num2=i-1 result=num1/num2 print(result) if__name__=='__main__': division(10,0)
调试代码
在控制台输入命令:
pythontext.py
运行代码后,控制台输出如下内容
@pysnooper.snoop('/app/project_log.log')
一些公司对日志输出会有要求,比如每行日志要以某某字符串开头,这时只需在装饰器中加入需要字符穿即可:
@pysnooper.snoop(prefix='MyCompanyName:')
上述所讲的都是PySnooper装饰器的常用参数,例如监控自定义表达式、监控底层函数、多线程等PySnooper同样支持,具体参数可以在官方项目文档中查看。
前面我们所讲的都是在函数上利用装饰器来监控整个函数,但是在实际项目中往往一个函数内容会很多,如果监控整个函数会导致输出的日志过多,这时我们就可以利用PySnooper的局部监控功能来监控函数中需要监控的代码片段。现在我们来修改一下代码,只监控输出的值:
importpysnooper defdivision(start,end): foriinrange(start,end,-1): withpysnooper.snoop(): num1=i num2=i-1 result=num1/num2 print(result) if__name__=='__main__': division(10,0)
上述代码运行后我们就会发现输出的内容少了很多。
二、Better-exceptions
Better-exceptions同样是Python的第三方工具库,它出现的原因是其实很简单就是“美化异常信息”(是不是感觉作者很任性)。Better-exceptions主要使用了Python的sys模块的excepthook方法,这个方法在当系统抛出异常时,解释器就会调用它,同时传递三个参数:异常类、异常实例和traceback对象,这就说明我们可以重写这个方法来捕获系统异常。但是,因为我们可以重写excepthook方法来捕获系统异常,因此Better-exceptions对与Web框架来说是不起任何作用的,因为Web框架都已经处理了系统抛出的异常,不会再以hook的方式触发Better-exceptions。下面我们就来看一下该怎么用。
安装Better-exceptions
首先在控制台输入如下命令:
pipinstallbetter-exceptions
等待两秒钟后Better-exceptions安装完成。
接着我们在控制台输入如下代码,来设置环境变量:
setxBETTER_EXCEPTIONS1
调试代码
在控制台输入命令:
pythontext.py
代码运行后,控制台输出如下图:
从上面的图我们可以看到,Better-exceptions对异常代码进行了着色,并对产生异常的变量值进行了输出。通过这两项内容我们就可以很快捷的看到具体报错位置和报错原因。
这里有需要注意的地方就是,在Windows系统下输出的日志会存在乱码问题,这是因为Better-exceptions的编码格式造成的。要解决这个问题我们只需要修改better-exceptions目录下的encoding.py文件,讲文件中的ENCODING=locale.getpreferredencoding()修改为ENCODING='utf-8'即可。
三、PDB
PDB是Python内置的模块,我们可以利用PDB设置断点和跟踪调试。PDB的使用不需要再安装第三方插件,只需要在命令行输入如下命令:
python-mpdbTest.py
命令执行后将会进入PDB调试模式。如果需要在代码中加入断点,只需要在需要加入断点的位置加入pdb.set_trace()即可。当进入到PDB模式后,输入c就可以从当前断点直接跳转到下一个断点,如果后续没有断点,则会将剩余代码执行完。当然,如果需要单步执行代码,在控制台输入s指令,但是有时主函数会调用大量的其他函数,这时在命令行输入n就可以只在主函数中执行单步调试。除了上述指令外,PDB还有其他指令,如下表:
指令 | 说明 |
---|---|
l | 显示所有代码 |
n | 执行下一条代码 |
c | 执行当前断点后面的代码,知道代码执行完毕 |
bx | 在代码的第X行设置断点 |
clear | 清除全部断点 |
s | 单步执行 |
sfunction_name | 进入function_name函数内部执行 |
q | 退出PDB |
a | 打印所有参数值 |
p | 打印指定变量值 |
r | 忽略剩余断点,将剩余代码执行完毕 |
四、总结
我们讲解了PySnooper、Better-exceptions和PDB的用法,这三种方法一般都使用在服务器上,这里我推荐使用Better-exceptions,因为它对代码的侵入性很小,几乎不需要改变代码。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。