巧克力摊位模拟器绿色免安装中文版
599M · 2025-12-10
在 Python 中,最值得深入掌握的两个调试工具是:
这篇文章我们就系统聊一聊它们的核心使用方式。
初学者常见的开发方式是“打印调试”——哪错了就 print 一行,然后不停改代码反复跑。
这种方式有两个明显问题:
pdb 和 logging 正是为了解决这些痛点,让你在开发和线上运维阶段都更得心应手。
pdb 是 Python 内置的命令行调试器,它允许你:
简直是排查 bug 的神器。
在你怀疑有问题的地方插入:
import pdb
pdb.set_trace()
执行时程序会在这一行停下来,并进入调试界面。
| 命令 | 作用 |
|---|---|
| n | next,执行下一行,不进入函数内部 |
| s | step,进入函数内部执行 |
| c | continue,继续执行到下一个断点 |
| l | list,查看当前执行区域的代码 |
| p 变量名 | 查看变量的值 |
| q | quit,退出调试 |
举个简单例子:
def calc(a, b):
import pdb; pdb.set_trace()
return a + b
print(calc(10, 20))
调试时你可以:
p a 查看参数n 逐步往下跑q 退出调试体验类似 VSCode,但直接在终端即可完成。
这个技巧非常实用:
python -m pdb your_script.py
当程序报错时会自动暂停在异常处,让你现场查看变量并回溯堆栈。
非常适合排查隐藏的边界问题、线上问题复现等场景。
如果说 pdb 更适合开发阶段,那 logging 就是线上阶段的“黑盒记录器”。
print 只是把内容输出到控制台,但 logging 能做到:
真正的项目一定要用 logging,而不是满屏的 print。
import logging
logging.basicConfig(level=logging.INFO)
logging.info("任务开始")
logging.warning("数据格式异常,已跳过一条记录")
logging.error("数据库连接失败")
输出:
INFO:root:任务开始
WARNING:root:数据格式异常,已跳过一条记录
ERROR:root:数据库连接失败
| 级别 | 适用场景 |
|---|---|
| DEBUG | 详细的调试信息,开发阶段最常用 |
| INFO | 程序正常运行的关键事件 |
| WARNING | 可疑,但程序还能继续 |
| ERROR | 错误,需要处理 |
| CRITICAL | 致命错误,程序即将终止 |
生产环境一般用 INFO 或 WARNING。
logging.basicConfig(
level=logging.INFO,
filename="run.log",
format="%(asctime)s - %(levelname)s - %(message)s"
)
关键参数解释:
filename:指定日志文件format:控制输出格式asctime:打印时间levelname:日志级别message:日志内容示例输出:
2025-03-05 10:33:21,932 - INFO - 爬虫启动
2025-03-05 10:33:22,124 - WARNING - 请求延迟过高
这个格式在定位问题时非常有用。
稍进阶一点:
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.set_trace()水平提升非常明显。
学会调试是一名 Python 工程师必须跨过的一道坎。 会用 pdb,你就不再盲看代码。 会用 logging,你的程序就不再黑箱运行。
两者结合,你在查问题、排障、优化性能、处理线上日志时都会变得轻松很多。 也正是这类能力,让一个开发者真正具备生产力和工程视角。