Python编程实战:用好 pdb 和 logging,程序再也不黑箱运行了

在 Python 的学习路径里,能跑出结果只是第一步;真正让一个人从"会写"走向"能干活"的,是是否掌握调试技巧。 调试能力强,你的开发速度会呈指数级提升------问题定位快、输出可控、线上稳定,这才是职业化的表现。

在 Python 中,最值得深入掌握的两个调试工具是:

  • pdb:交互式断点调试器
  • logging:可控、分级、可落盘的运行日志体系

这篇文章我们就系统聊一聊它们的核心使用方式。


一、为什么你必须学会调试?

初学者常见的开发方式是"打印调试"------哪错了就 print 一行,然后不停改代码反复跑。

这种方式有两个明显问题:

  1. 效率低:每改一次就得重新运行。
  2. 信息不全:看不到变量的真实状态、看不到调用栈。

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 致命错误,程序即将终止

生产环境一般用 INFOWARNING


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 持续记录程序运行行为。

现实开发中,常见调试流程就是:

  1. 通过 logging 定位哪块逻辑可能有问题
  2. 在对应代码加 pdb.set_trace()
  3. 单步查看变量是否异常
  4. 修复
  5. 清理断点,保留日志

水平提升非常明显。


五、总结

学会调试是一名 Python 工程师必须跨过的一道坎。 会用 pdb,你就不再盲看代码。 会用 logging,你的程序就不再黑箱运行。

两者结合,你在查问题、排障、优化性能、处理线上日志时都会变得轻松很多。 也正是这类能力,让一个开发者真正具备生产力和工程视角。

相关推荐
程序员爱钓鱼1 小时前
Python编程实战:从 timeit 到 cProfile,一次搞懂代码为什么慢
后端·python·trae
Mintopia1 小时前
⚡Trae Solo Coding 的效率法则
前端·人工智能·trae
2501_941111511 小时前
Python多线程与多进程:如何选择?(GIL全局解释器锁详解)
jvm·数据库·python
JaguarJack2 小时前
进阶学习 PHP 中的二进制和位运算
后端·php
Moment2 小时前
专为 LLM 设计的数据格式 TOON,可节省 60% Token
前端·javascript·后端
2501_941111332 小时前
使用Python处理计算机图形学(PIL/Pillow)
jvm·数据库·python
青梅主码2 小时前
麦肯锡联合QuantumBlack最新发布《2025年人工智能的现状:智能体、创新和转型》报告:32% 的企业预计会继续裁员
前端·人工智能·后端
William_cl2 小时前
【ASP.NET进阶】Controller 层基础:从 MVC 5 到 Core,继承的奥秘与避坑指南
后端·asp.net·mvc
小小测试开发2 小时前
Python数据科学与图像处理利器组合:Prophet、Arch、Scikit-image、Pillow-heif用法全解析
图像处理·python·pillow