【译】如何使用Python debugger

浏览: 1293

作者:Zygmunt Z

来源:FastML

参与:Cynthia

翻译:本文为天善智能编译,未经容许,禁止转载


在编写代码时,每个人都会犯错误。有时很难调试它们。使用调试器可能有所帮助,但也可能令人生畏。本文是在IPython中使用pdb的TLDR教程,重点关注函数内部的变量。

全局变量的好处是,当一个脚本停止使用一个错误时,你可以查看变量来发现原因。使用函数时,你就没有这样的好运了。当然,任何重要的软件都会使用到函数。

于是我们就要用到调试器(debugger)了。Python自带一个叫作pdb的调试器,我们将介绍如何用IPython运行它。

首先,你需要启动它:

In [1]: pdb
Automatic pdb calling has been turned ON

而且,你可以选择只有在出现错误之后才进入调试模式的选项。在这种情况下,你只需事后键入debug

pdbdebug都是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
推荐 1
本文由 sw_Yang 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册