Python 调试冷知识
对于 python 代码的调试我们通常都是使用 IDE 自带的调试功能。但是 IDE 提供的调试功能存在局限性,例如在测试服务器上调试代码,但是又不可能在测试服务器上安装 IDE 进行调试。这时我们就可以利用下面所讲解的三个工具进行调试。
零、准备调试代码
在讲解三个调试工具前,我们先编写待调试的代码。代码很简单,就是计算两个数的商。我们在编写代码的时候故意留下了除数为 0 的 bug。
def division(start, end):
for i in range(start, end, -1):
num1 = i
num2 = i - 1
result = num1 / num2
print(result)
if __name__ == '__main__':
division(10, 0)
PySnooper
PySnooper 是 Python 的第三方工具库,它可以精确的显示代码的执行时间、执行顺序和代码中的局部变量值的变化等。PySnooper 使用方法很简单,只需要将它作为装饰器来使用即可。下面我们来看一下具体使用步骤:
在控制台输入如下命令:
pip install pysnooper
首先需要引入 PySnooper
import pysnooper
接着在需要测试的函数上加上 pysnooper 装饰器
@pysnooper.snoop()
def division(start, end):
for i in range(start, end, -1):
num1 = i
num2 = i - 1
result = num1 / num2
print(result)
if __name__ == '__main__':
division(10, 0)
python text.py
@pysnooper.snoop('/app/project_log.log')
@pysnooper.snoop(prefix='MyCompanyName: ')
前面我们所讲的都是在函数上利用装饰器来监控整个函数,但是在实际项目中往往一个函数内容会很多,如果监控整个函数会导致输出的日志过多,这时我们就可以利用 PySnooper 的局部监控功能来监控函数中需要监控的代码片段。现在我们来修改一下代码,只监控输出的值:
import pysnooper
def division(start, end):
for i in range(start, end, -1):
with pysnooper.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
首先在控制台输入如下命令:
pip install better-exceptions
接着我们在控制台输入如下代码,来设置环境变量:
setx BETTER_EXCEPTIONS 1
调试代码
在控制台输入命令:
python text.py
从上面的图我们可以看到,Better-exceptions 对异常代码进行了着色,并对产生异常的变量值进行了输出。通过这两项内容我们就可以很快捷的看到具体报错位置和报错原因。
这里有需要注意的地方就是,在 Windows 系统下输出的日志会存在乱码问题,这是因为 Better-exceptions 的编码格式造成的。要解决这个问题我们只需要修改 better-exceptions 目录下的 encoding.py 文件,讲文件中的 ENCODING = locale.getpreferredencoding() 修改为 ENCODING = 'utf-8'即可。
PDB
PDB 是 Python 内置的模块,我们可以利用 PDB 设置断点和跟踪调试。PDB 的使用不需要再安装第三方插件,只需要在命令行输入如下命令:
python -m pdb Test.py
总结
我们讲解了 PySnooper 、Better-exceptions 和 PDB 的用法,这三种方法一般都使用在服务器上,这里我推荐使用Better-exceptions,因为它对代码的侵入性很小,几乎不需要改变代码。
【END】
热 文 推 荐
☞为何Google、微软、华为将亿级源代码放一个仓库?从全球最大代码管理库说起