精通 Python 调试:高效技巧与最佳实践
对许多人而言,Python 调试等于到处加 print 语句,再根据输出猜代码逻辑。这非最佳,但不知为何大家就是不愿碰 Python 调试器。
目录
用 print 调试
若你也是用 print 调试派,我不评判。学 Python 难,编程难,生活难。若已举步维艰,再学新工具确嫌累。塞个 print……就是省事。坦白说:我现在也常这么干,没那么糟糕。
但我要教个小窍门:同样省事,却给你无限调试超能力,想征服世界随时可用。
设置 Python 调试器断点
无需 IDE 也能专业调试。此招通用于最简编辑器,甚至 Jupyter Notebook。
核心就是:在原本加 print 的位置插入 breakpoint() 指令。
效果如何?实测:新建简单程序:
def add_two(x):
return x + 2
for i in range(1, 10):
a = add_two(i)
breakpoint()
print(a)
运行后(REPL、命令行、IDE 均可),直接进入 Python 调试器 PDB。然后呢?
使用 Python 调试器
运行上述程序,输出:
$ python3 breakpointing.py > /home/erik/breakpointing.py(7)<module>() -> print(a) (Pdb)
关键信息:
• 当前执行文件(breakpointing.py)
• 即将执行但被 breakpoint() 打断的下一条指令
• PDB 提示符,等待输入
Python 调试器本质是功能完备的 Python Shell,同 REPL。
此刻可审查当前环境。查变量 a 当前值:
(Pdb) print(a) 3 (Pdb) print(i) 1
除 print,PDB 专用命令 p 同样适用:
(Pdb) p a 3 (Pdb) p i 1
执行下一行
想执行下一行?两种方式:
s或step:执行当前行,停在下一个可能位置(会进入函数内部)。n或next:执行当前行,停在当前函数下一行(跨过函数调用)。
对比:step 会进函数内部断住;next 运行完函数返回后,停在下一行。其他调试器/IDE 称“step into”与“step over”。
实操演示:
$ python3 breakpointing.py -> print(a) (Pdb) s 3 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) n -> breakpoint() (Pdb) n -> print(a) (Pdb) n 4 -> for i in range(1, 10): (Pdb) s -> a = add_two(i) (Pdb) s --Call-- -> def add_two(x): (Pdb) s -> return x + 2 (Pdb) s --Return-- 5 -> return x + 2 (Pdb) s -> breakpoint() (Pdb)
首次用 n 跨过 add_two 调用;第二次用 s 步入函数内部。
Python 调试器常用命令
更多命令自行探索,列举最实用者:
h(help):列出所有命令。带参数如h c显示c说明c(continue):运行至下一断点l(list):列出当前行上下文源码p:打印表达式值,可替代print()pp:美化打印,适合字典等数据结构restart:重启当前程序
完整文档见 Python 官方调试器页面。
持续学习
虽此法极便捷,仍建议深入掌握 IDE 自带调试器。VSCode 用户可参考我写的《VSCode 中调试 Python 代码》教程。

Python