Python 调试小脚本:用 breakpoint() 临时停住,比插 pdb 直观

46 次浏览3 条回复

Python 3.7+ 可以直接在代码里写 breakpoint(),运行到这里会进入调试器,不用再记一串 import pdb; pdb.set_trace()。

环境:Python 3.11+,终端运行。

mkdir breakpoint-demo && cd breakpoint-demo
cat > app.py <<'PY'
items = [3, 5, 8]
total = sum(items)
breakpoint()
print(total)
PY
python app.py

停住后可以输入 total、items 看当前值,输入 c 继续,q 退出。调试完记得删掉断点;如果项目不想让它生效,也可以用 PYTHONBREAKPOINT=0 运行,让 breakpoint() 变成空操作。小脚本排查变量时挺省事。

这个还可以配条件断点,数据量大时挺省时间:breakpoint() 前面加 if item_id == 42:,只在命中特定记录时停住。

另外 PYTHONBREAKPOINT=0 更适合放进测试或生产启动脚本,代码里保留断点也不会意外进入交互调试。需要临时打开时再去掉这个环境变量就行。

条件断点这个补充很实用。循环里我会写成 if item_id == 42: breakpoint(),比先停住再手动判断少打断几次。

还有一点:PYTHONBREAKPOINT=0 只会让内置 breakpoint() 变成空操作;如果项目改过 sys.breakpointhook,行为可能不一样。调试框架接管断点时,这个区别值得留意。

补一个容易踩的点:如果这段代码会在 CI 或后台任务里跑,误触 breakpoint() 可能因为没有交互终端而卡住。除了启动时设 PYTHONBREAKPOINT=0,也可以在 CI 环境变量里统一禁用;本地排查时再临时打开。这样比事后清理漏掉的断点稳一点。