Python 服务器调试实战:PySnooper、Better-exceptions 与 PDB 详解
本文介绍在无法使用 IDE 的服务器环境中,利用 PySnooper、Better-exceptions 和 PDB 进行 Python 代码调试的三种方法。PySnooper 通过装饰器监控变量与执行流,Better-exceptions 美化异常输出,PDB 提供交互式断点调试。文章涵盖安装、配置及常见参数设置,帮助开发者高效定位代码错误。
Python 服务器调试背景与工具概览
在 Python 开发中,我们通常依赖集成开发环境(IDE)内置的调试功能。然而,这种依赖在测试服务器等生产环境中往往难以实现,因为直接在服务器上安装 IDE 既不现实也不安全。针对这一痛点,本文将介绍三种无需 IDE 支持的 Python 调试工具,帮助你在服务器环境下高效排查代码问题。
零、准备调试代码
在正式介绍工具之前,我们需要构建一个包含典型错误的示例代码。该代码逻辑简单,旨在计算两个数值的商。为了演示调试效果,我们在代码中故意引入了一个除数为 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
PySnooper 是一款 Python 第三方库,它能够精确记录代码的执行时间、执行顺序以及局部变量的值变化。其使用方式非常直观,只需将 PySnooper 作为装饰器应用到目标函数即可。以下是具体的使用步骤:
安装 PySnooper
1. 在控制台输入如下命令:
pip install pysnooper
等待约两秒钟,PySnooper 安装即告完成。
2. 加入 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 输出日志的开头和结尾部分。从日志中可以清晰看到每行代码的执行顺序、耗时、变量值的变化轨迹以及最终的报错信息。在实际项目中,PySnooper 生成的日志量可能非常大,直接在控制台查看体验不佳。此时,我们可以将日志输出到本地文件,只需在 PySnooper 装饰器中指定日志保存路径即可:
@pysnooper.snoop('/app/project_log.log')
部分公司对日志格式有特定要求,例如要求每行日志以特定字符串开头。只需在装饰器中添加相应的 prefix 参数即可实现:
@pysnooper.snoop(prefix='MyCompanyName: ')
上述介绍的是 PySnooper 装饰器的常用参数。此外,它还支持监控自定义表达式、底层函数以及多线程环境等高级功能,具体参数配置可参考官方项目文档。 前文所述均为监控整个函数的场景。在实际项目中,若函数体庞大,监控全函数会导致日志冗余。此时,可利用 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
Better-exceptions 同样是 Python 的第三方库,其核心功能是“美化异常信息”(作者风格独特)。它通过重写 Python sys 模块中的 excepthook 方法来实现,该方法在系统抛出异常时被解释器调用,并传递异常类、异常实例和 traceback 对象三个参数。由于 Web 框架通常已自行处理异常,不再通过 hook 方式触发,因此 Better-exceptions 对 Web 框架无效。下面介绍具体用法:
安装 Better-exceptions
首先在控制台输入如下命令:
pip install better-exceptions
等待约两秒钟,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
PDB 是 Python 内置的标准模块,支持设置断点和跟踪调试。使用 PDB 无需安装第三方插件,只需在命令行输入如下命令:
python -m pdb Test.py
命令执行后,将进入 PDB 调试模式。若需在代码中插入断点,只需在目标位置添加 pdb.set_trace() 即可。进入 PDB 模式后,输入 c 可从当前断点直接跳转至下一个断点;若无后续断点,则执行剩余代码。若需单步执行,可在控制台输入 s 指令;但当主函数调用大量其他函数时,输入 n 指令可在主函数层面进行单步调试。除上述指令外,PDB 还提供其他命令,如下表所示:
| 指令 | 说明 |
|---|---|
| l | 显示所有代码 |
| n | 执行下一条代码 |
| c | 执行当前断点后面的代码,知道代码执行完毕 |
| b x | 在代码的第X行设置断点 |
| clear | 清除全部断点 |
| s | 单步执行 |
| s function_name | 进入 function_name 函数内部执行 |
| q | 退出PDB |
| a | 打印所有参数值 |
| p | 打印指定变量值 |
| r | 忽略剩余断点,将剩余代码执行完毕 |
总结与推荐
四、总结
本文介绍了 PySnooper、Better-exceptions 和 PDB 的使用方法。这三种工具均适用于服务器环境,其中推荐使用 Better-exceptions,因其对代码的侵入性极小,几乎无需修改原有代码结构。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









