我应该使用什么选项?—— 调试python代码 | 第一部分 开始 —— 第 3 章: 你是如何运行程序的 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-金年会app官方网
自然,我的读者或学生都从不会在代码中有bug(:smile:),但对于你的那些可能不是那么幸运的朋友,下面是通常被真实世界的python程序员使用的调试代码策略的一个快速回顾,在你开始认真编码时作为参考:
- 什么都不做。 这个并不是意味着python程序员不调试他们的代码——但当在python程序中犯错时,会得到一个非常有用和可读的错误信息(如果还没有得到,很快就会看到的)。如果已经懂python,且特别是对自己的代码,这通常足够了——阅读错误信息,然后修复标记处的行和文件。对许多人来说,这就是python的调试。然而,对于还没有编写的更大系统来说,它可能并不总是理想的。
- 插入
print
语句。 很可能python程序员调试代码的主要方式(也是我调试 python代码的方式)就是插入print
语句然后再次运行。因为python在更改后立即运行,这通常是获得比错误消息提供的信息更多的最快方式。print
语句不需要很复杂——一个简单的“我在这里”或变量值的显示通常足够提供你所需要的上下文。只要记住在发布代码前删除或注释掉(比如在前面添加一个 #)调试 的prints
即可。 - 使用ide gui 调试器。 对于还没有编写的更大的系统,和对于想更详细地跟踪代码的初学者来说,大多数python开发guis 都有某种点击的调试支持。idle也有一个调试器,但它在实践中似乎用得不是很多——可能是因为它没有命令行,或可能因为添加
print
语句通常比设置一个gui 调试会话要更快。要学习更多,参见idle的帮助,或简单地亲自尝试一下;它的基本界面在 高级idle工具 这一节中有描述。其他的ide,比如eclipse,netbeans,komodo,和 wing die,也都提供了高级的点击调试器;如果使用它们请参考对应的文档。 - 使用 pdb 命令行 调试器。要获得终极控制,python带有一个名为 pdb的源码调试器,作为python标准库的一个模块可用。在pdb中,逐行键入命令,显示变量,设置和清除断点,前进到一个断点或错误,如此等等。可以通过导入pdb,或作为一个顶层脚本来交互地启动它。因为是键入命令来控制这个会话,这两种方式都提供了一个强大的调试工具。 pdb 还包括了一个 postmortem 函数(pdb.pm()),在发生一个异常后可以运行它,来获得错误发生时的信息。参见python库手册和第36章来获取关于pdb的更多细节,和附录a来获得一个例子或使用 python 的
-m
命令参数将pdb作为一个脚本来运行。 - 使用 python的 -i 命令行参数。除了添加 prints 或在pdb下运行,仍然可以查看错误的原因。如果从命令行运行脚本且在
python
和脚本名之间传递一个-i
参数(比如,python -i m.py
),当脚本存在时,python就将进入它的交互式解释器模式(>>>提示符),不管它是否成功结束或碰到一个错误。在这时,因为他们在顶层命名空间中,你可以打印变量的最终值来获得代码发生情况的更多细节;如果脚本失败了,它的 postmortem 模式将让你检查最近的错误。附录a也显示了-i
的示例。 - 其他选项。对于更具体的调试需求,可以在开源领域找到额外的工具,包括对多线程程序的支持,嵌入代码,和对进程附加调试器。比如,winpdb系统,就是一个独立的调试器,有高级的调试支持和跨平台的gui和控制台界面。
随着开始编写更大的脚本,这些选项将变得更加重要。然而,关于调试的最好消息很可能是在python中错误被探测到并被报告出来,而不是安静地忽略或完全毁掉系统。事实上,错误本身是一个被称作异常(可以捕获并处理。关于异常的更多见 part vii)的明确定义的机制。当然,犯错从不有趣,但从一些人的回忆来看(当时的调试意味着拿出一个十六进制的计算器然后深入研究一大堆内存打印输出):python的调试支持让错误变得比它们原本的痛苦要少许多。