「译」如何使用Python debugger(调试器)

感谢关注天善智能,走好数据之路↑↑↑

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源(例如知乎),邀请你进入数据爱好者交流群,数据爱好者们都在这儿。


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

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

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

首先,你需要启动它:

In [1]: pdbAutomatic 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) in ()----> 1 add_two('two') in add_two(x)1 def add_two( x ):----> 2 return x + 2TypeError: cannot concatenate 'str' and 'int' objects> (2)add_two()1 def add_two( x ):----> 2 return x + 2ipdb>

或者是,pdb自动宣告终止:

In [3]: add_two('two')---------------------------------------------------------------------------TypeError Traceback (most recent call last) in ()----> 1 add_two('two') in add_two(x)1 def add_two( x ):----> 2 return x + 2TypeError: cannot concatenate 'str' and 'int' objectsIn [4]: debug> (2)add_two()1 def add_two( x ):----> 2 return x + 2ipdb>

pdb接受许多指令,其中许多是单个字母。你可以用h列出它们。

对于我们来说,最重要的指令是p,用于“打印”:

ipdb> h pp expressionPrint the value of the expression.ipdb> p x'two'

框架

在使用外部库时,堆栈跟踪由许多框架组成。在这个堆栈的某个地方出现了错误时,大多数情况下,人们倾向于在自己的代码中寻找错误,但是调试器建立在最深层的函数中。我们需要向上移动堆栈,执行这一步骤的指令是u。 将它输入熟悉的代码片段中就可以检查变量了。

跟踪/断点

进入调试器不非得创造一个错误。在代码中某处设置一个跟踪或断点就足够了::

import pdb; pdb.set_trace()

当执行到达此点时,程序将停止,您将得到一个调试器提示符。要继续执行exectution,使用c指令。

你还可以使用b命令在调试器中添加断点。

退出

q键退出调试器。你还可以使用Ctrl-D

当你完成调试且不希望调试器提示错误时,你可以关闭它:

In [5]: pdbAutomatic pdb calling has been turned OFF


作者:Zygmunt Z

来源:FastML

参与:Cynthia

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

猜你喜欢

转载自blog.csdn.net/r3ee9y2oefcu40/article/details/80423924