作者:Zygmunt Z
来源:FastML
参与:Cynthia
翻译:本文为天善智能编译,未经容许,禁止转载
在编写代码时,每个人都会犯错误。有时很难调试它们。使用调试器可能有所帮助,但也可能令人生畏。本文是在IPython中使用pdb的TLDR教程,重点关注函数内部的变量。
全局变量的好处是,当一个脚本停止使用一个错误时,你可以查看变量来发现原因。使用函数时,你就没有这样的好运了。当然,任何重要的软件都会使用到函数。
于是我们就要用到调试器(debugger)了。Python自带一个叫作pdb的调试器,我们将介绍如何用IPython运行它。
首先,你需要启动它:
In [1]: pdb
Automatic pdb calling has been turned ON
而且,你可以选择只有在出现错误之后才进入调试模式的选项。在这种情况下,你只需事后键入debug。
pdb和debug都是IPython的magic commands,所以它们的官方语法是%pdb和%debug。如果没有这些名称的全局变量,那么省略形式也会起作用。
下面我们来定义一个函数:
def add_two( x ):
return x + 2
当错误出现时,你就会得到一个调试器提示:
In [3]: add_two('two')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-a77015a373f8> in <module>()
----> 1 add_two('two')
<ipython-input-8-a95bdacf8a55> in add_two(x)
1 def add_two( x ):
----> 2 return x + 2
TypeError: cannot concatenate 'str' and 'int' objects
> <ipython-input-8-a95bdacf8a55>(2)add_two()
1 def add_two( x ):
----> 2 return x + 2
ipdb>
或者是,pdb自动宣告终止:
In [3]: add_two('two')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-a77015a373f8> in <module>()
----> 1 add_two('two')
<ipython-input-1-3da9f0985321> in add_two(x)
1 def add_two( x ):
----> 2 return x + 2
TypeError: cannot concatenate 'str' and 'int' objects
In [4]: debug
> <ipython-input-1-3da9f0985321>(2)add_two()
1 def add_two( x ):
----> 2 return x + 2
ipdb>
pdb接受许多指令,其中许多是单个字母。你可以用h列出它们。
对于我们来说,最重要的指令是p,用于“打印”:
ipdb> h p
p expression
Print the value of the expression.
ipdb> p x
'two'
框架
在使用外部库时,堆栈跟踪由许多框架组成。在这个堆栈的某个地方出现了错误时,大多数情况下,人们倾向于在自己的代码中寻找错误,但是调试器建立在最深层的函数中。我们需要向上移动堆栈,执行这一步骤的指令是u。 将它输入熟悉的代码片段中就可以检查变量了。
跟踪/断点
进入调试器不非得创造一个错误。在代码中某处设置一个跟踪或断点就足够了::
import pdb; pdb.set_trace()
当执行到达此点时,程序将停止,您将得到一个调试器提示符。要继续执行exectution,使用c指令。
你还可以使用b命令在调试器中添加断点。
退出
用q键退出调试器。你还可以使用Ctrl-D
当你完成调试且不希望调试器提示错误时,你可以关闭它:
In [5]: pdb
Automatic pdb calling has been turned OFF