在 Python 的学习路径里,能跑出结果只是第一步;真正让一个人从"会写"走向"能干活"的,是是否掌握调试技巧。 调试能力强,你的开发速度会呈指数级提升------问题定位快、输出可控、线上稳定,这才是职业化的表现。
在 Python 中,最值得深入掌握的两个调试工具是:
- pdb:交互式断点调试器
- logging:可控、分级、可落盘的运行日志体系
这篇文章我们就系统聊一聊它们的核心使用方式。
一、为什么你必须学会调试?
初学者常见的开发方式是"打印调试"------哪错了就 print 一行,然后不停改代码反复跑。
这种方式有两个明显问题:
- 效率低:每改一次就得重新运行。
- 信息不全:看不到变量的真实状态、看不到调用栈。
pdb 和 logging 正是为了解决这些痛点,让你在开发和线上运维阶段都更得心应手。
二、pdb:像打游戏一样单步查看你的代码
pdb 是 Python 内置的命令行调试器,它允许你:
- 在代码任意位置设置断点
- 暂停执行
- 查看变量
- 单步运行
- 跳过函数
- 回溯错误上下文
简直是排查 bug 的神器。
1. 最简单的用法:pdb.set_trace()
在你怀疑有问题的地方插入:
python
import pdb
pdb.set_trace()
执行时程序会在这一行停下来,并进入调试界面。
2. 调试常用命令(非常实用)
| 命令 | 作用 |
|---|---|
| n | next,执行下一行,不进入函数内部 |
| s | step,进入函数内部执行 |
| c | continue,继续执行到下一个断点 |
| l | list,查看当前执行区域的代码 |
| p 变量名 | 查看变量的值 |
| q | quit,退出调试 |
举个简单例子:
python
def calc(a, b):
import pdb; pdb.set_trace()
return a + b
print(calc(10, 20))
调试时你可以:
p a查看参数n逐步往下跑q退出
调试体验类似 VSCode,但直接在终端即可完成。
3. 遇到异常自动进入 pdb
这个技巧非常实用:
bash
python -m pdb your_script.py
当程序报错时会自动暂停在异常处,让你现场查看变量并回溯堆栈。
非常适合排查隐藏的边界问题、线上问题复现等场景。
三、logging:程序"自己写日记",方便你随时回溯
如果说 pdb 更适合开发阶段,那 logging 就是线上阶段的"黑盒记录器"。
print 只是把内容输出到控制台,但 logging 能做到:
- 按严重级别打印日志
- 输出到文件
- 输出时间、行号、文件名、函数名
- 灵活配置
- 线上问题快速定位
真正的项目一定要用 logging,而不是满屏的 print。
1. logging 的基本用法
python
import logging
logging.basicConfig(level=logging.INFO)
logging.info("任务开始")
logging.warning("数据格式异常,已跳过一条记录")
logging.error("数据库连接失败")
输出:
less
INFO:root:任务开始
WARNING:root:数据格式异常,已跳过一条记录
ERROR:root:数据库连接失败
2. 日志级别说明(非常关键)
| 级别 | 适用场景 |
|---|---|
| DEBUG | 详细的调试信息,开发阶段最常用 |
| INFO | 程序正常运行的关键事件 |
| WARNING | 可疑,但程序还能继续 |
| ERROR | 错误,需要处理 |
| CRITICAL | 致命错误,程序即将终止 |
生产环境一般用 INFO 或 WARNING。
3. logging 输出到文件
python
logging.basicConfig(
level=logging.INFO,
filename="run.log",
format="%(asctime)s - %(levelname)s - %(message)s"
)
关键参数解释:
filename:指定日志文件format:控制输出格式asctime:打印时间levelname:日志级别message:日志内容
示例输出:
yaml
2025-03-05 10:33:21,932 - INFO - 爬虫启动
2025-03-05 10:33:22,124 - WARNING - 请求延迟过高
这个格式在定位问题时非常有用。
4. 同时输出到文件和控制台
稍进阶一点:
python
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 控制台输出
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# 文件输出
file = logging.FileHandler("run.log")
file.setLevel(logging.DEBUG)
# 设置格式
formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
console.setFormatter(formatter)
file.setFormatter(formatter)
logger.addHandler(console)
logger.addHandler(file)
这是实际项目非常常见的日志配置方式。
四、pdb 与 logging 的结合:最佳实践
开发阶段: 用 pdb 精准定位问题。
上线阶段: 用 logging 持续记录程序运行行为。
现实开发中,常见调试流程就是:
- 通过 logging 定位哪块逻辑可能有问题
- 在对应代码加
pdb.set_trace() - 单步查看变量是否异常
- 修复
- 清理断点,保留日志
水平提升非常明显。
五、总结
学会调试是一名 Python 工程师必须跨过的一道坎。 会用 pdb,你就不再盲看代码。 会用 logging,你的程序就不再黑箱运行。
两者结合,你在查问题、排障、优化性能、处理线上日志时都会变得轻松很多。 也正是这类能力,让一个开发者真正具备生产力和工程视角。