python 程序的的调试

在这里我们将学到如何去调试一个python 程序。

要debug 一个Python 程序, 我们需要引入(import)内置的 module 模块pdb。

首先, 打开notepad++, 编写如下的程序:

# epdb1.py ----experiment with the python debugger, pdb
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final 

命名为epdb1.py保存在D:\python学习\    目录下面:



上述的相关的代码解释:

pdb.set_trace() 是在pdb 模块中定义的函数。 该函数的作用是插在我们要进行开始调试的的那行的代码的前面。



接下面, cmd 打开dos 终端, 切换到代码的目录下面, 然后运行 python  epdb1.py, 具体如下:



接下来, 就开始debug了(程序运行到设置的位置, 就开始一行行运行)。

通过在提示符((Pdb))输入n (意思是next line), 然后点击ENTER键及运行到下一行, 具体的如下:



最终, 我们完成了调试的任务了。


关于调试的tip1:

第一次需要点击点击n, 然后点击ENTER键,就可以了。 之后, 我们只点击ENTER 键, 不用再点击n,  就发现程序会继续一步步运行的, 直至结束。


这后面的philosophy如下:


If you press ENTER without entering anything, pdb will re-execute the last command that you gave it.



关于调试的tip2:

如何退出调试, 我们只需要在提示符后面点击q,  然后RNTER键即可。 就可以quit了:




tip3: 在(pdb)提示符后面想要打印变量,例如我们先要在程序运行到某出显示变量的值(显示多个变量在指令p 的后面的变量用逗号分隔开),  需要的指令是p a, b, c 然后点击ENTER键即可。 




(向上的箭头边上dos 中执行的上一个命令。)


tip4 是一个注意。 也就是说最后 -> 后面显示的程序的一行指令 值即将被执行的指令。 但是并没有没执行。 所以不难看出下面出现错误。



tip 5: 通过输入c(意思是continue), 使得我们程序退出调试程序的过程。 上面提到的通过输入q 退出调试的方式是一种粗暴的方式, 基本上使得我们的程序crash。 现在我们选择c 的方式:



注意, 点击c使得我们的程序继续向下运行, 直至出现下一个的调试语句(pdb.set_trace() ). 所以, 如果我们的pdb.set_trace() 函数位于某一个loop中, 只能保证当前的循环不会调试, 循环的下一轮仍然会继续进入调试状态的。



tip6: 调试的过程中如何查看我们当前程序的运行到了哪一行?

答案是提示符(pdb)后面使用l 命令。 意思是listing, 该命令会列出程序中连续的的11行代码(如果有超过11行的代码)。 我们即将运行的代码位于这11行代码的正中间, 用箭头指示(注意current line, 但是并没有运行)。



从上图可见, 当前运行的位置。


所以通常的pdb 的调试的过程如下:




Stepping into subroutines… with “s” (step into)

当我们调试一个调用了函数的程序的时候, 有的时候我们希望能够在函数内部进行我们的调试工作。 例如下面的程序 :.

# epdb2.py -- experiment with the Python debugger, pdb
import pdb

def combine(s1,s2):      # define subroutine combine, which...
    s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ...
    s3 = '"' + s3 +'"'   # encloses it in double quotes,...
    return s3            # and returns it.

a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combine(a,b)
print final

在我们调试的过程中, 我们会遇到调用combine 函数的语句:

final = combine(a,b)

此时,如果我们仍然在在提示符后面输入n, 然后ENTER, 那么python 处理这行程序的方式和其他的普通行没有任何区别。 也就是说这个语句执行完了, 直接运行到下一行, 即打印出final。 

也就是说我们却无法去调试函数内的执行的每一句。

为了能够查看函数内部的执行细节, 我们需要在提示符后面输入s(意思是step into), 然后就可以进入到函数内部一句一句的调试了。

其实, 当我们执行 statements that do not involve function calls, “n” and “s” 命令做的事情是一样的。 都是执行当前句, 跳入下一句等。. But 当时当我们execute statements that invoke functions,输入 “s”, unlike “n”,确认, 将会step into the subroutine.本例中出现如下:

final = combine(a,b)

再次输入“s”, 接下来就会出现函数的第一句:

def combine(s1,s2):

综上, 调试过程如下:


Continuing… but just to the end of the current subroutine… with “r” (return)(注意, dos 下清屏的指令为cls)

当我们在函数内部通过‘s’一步一步的运行函数内的语句, 我们检查到了我们感兴趣的程序。 此时我们不想在函数内部继续逗留下去, 我们希望推出函数内的调试, 继续函数调用语句的下一句。 如果在(Pdb)提示符后面输入命令c, 然后ENTER, 就会一直运行到程序结束。 这显然不是我们希望得到的效果。 我们只是希望推出函数内部的调试。 我们的解决办法就是使用命令r, 然后ENTER,就退出函数内部的调试。





Python,有几种常见的调试方法可以帮助你找到和修复程序的错误。下面是一些常用的Python程序调试技巧: 1. 使用print语句:在代码插入print语句,输出一些关键变量的值,以便理解程序执行过程的状态。这是最简单和常用的调试方法之一。 2. 使用assert语句:assert语句用于检查某个条件是否为真,如果条件为假,则会抛出AssertionError异常。通过在关键位置添加assert语句,可以验证程序的假设条件,并在条件不满足时程序执行。 3. 使用pdb模块:pdb是Python的内置调试器,可以让你逐行执行代码,并在任意位置设置断点。你可以使用`import pdb`导入pdb模块,并在需要调试的位置插入`pdb.set_trace()`来启动调试器。 4. 使用IDE的调试功能:许多集成开发环境(IDE)都提供了强大的调试功能,例如PyCharm、Visual Studio Code等。这些工具可以让你逐步执行代码、查看变量的值、设置断点等。 5. 使用日志记录:通过使用Python的logging模块,你可以在程序插入日志记录语句,将关键信息输出到日志文件。这样可以帮助你追踪程序的执行过程,并查找错误。 6. 使用try-except语句:使用try-except语句捕获异常,可以在程序出现异常时,打印出异常信息并进行处理。这样可以更好地了解程序的问题所在。 以上是一些常见的Python程序调试方法。根据实际情况选择合适的调试方法,以帮助你找到和解决程序的错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值