【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
很长时间,我都以为python是没有单步调试的。也就是说,使用python不能像使用c一样快乐地单步调试,但事实上,python是可以的。和编译工具给出的单步调试不同,python的单步调试本身是作为一个lib集成在python语言里面的。今天,我们可以以一个简单的递归程序表示python是如何进行单步调试的。
一、python代码
import os
import sys
import re
import socket
def iterate(data):
if 1 == data:
return 1
else:
return iterate(data-1) +data
def main():
print iterate(10)
if __name__ == '__main__':
main()
二、代码说明
上面的代码内容非常简单,主要是打印递归数据。执行的时候只要输入python基本的命令就可以了,比如这样,
linux> python run.py
不出意外的话你会看到这样的打印,
linux> python run.py
55
三、代码的调试
如果只是一般的python代码,这样编写倒也无可厚非。因为代码的内容本来就很少,直接自己看一下逻辑,一般来说问题也不大。但是问题来了,如果代码本身的内容就很多,那么我们应该怎么用呢,这个时候就需要用到工具帮助我们了,一般来说,python下面要么使用log,要么使用pdb。
3.1 log的使用方法
说到log,其实就是print打印。当然复杂一点,你还可以用第三方库进行打印,比如说logging等等,使用的时候你只需要添加一个logging头就可以了,比如说像这样,
import logging
3.2 python单步调试的方法
在python里面单步调试非常简单。你需要做的其实就是在执行python的时候添加一些额外的条件,比如说,你需要这么执行
linux> python -m pdb run.py
这个时候呢,其实python已经进入了调试的状态了,因为你会看到下面这些内容,
feixiaoxingdeMacBook-Pro-3:Desktop feixiaoxing$ Python -m pdb run.py
> /Users/feixiaoxing/Desktop/run.py(3)<module>()
-> import os
(Pdb)
接下来你需要做的,就是像c程序员一样,设置断点、单步、调试、检查变量,查看堆栈回溯等等,就像这样,
feixiaoxingdeMacBook-Pro-3:test feixiaoxing$ python -m pdb run.py
> /Users/feixiaoxing/Desktop/test/run.py(1)<module>()
-> import os
(Pdb) b main
Breakpoint 1 at /Users/feixiaoxing/Desktop/test/run.py:12
(Pdb) r
> /Users/feixiaoxing/Desktop/test/run.py(13)main()
-> print iterate(10)
(Pdb) b iterate
Breakpoint 2 at /Users/feixiaoxing/Desktop/test/run.py:6
(Pdb) s
--Call--
> /Users/feixiaoxing/Desktop/test/run.py(6)iterate()
-> def iterate(data):
(Pdb) s
> /Users/feixiaoxing/Desktop/test/run.py(7)iterate()
-> if 1 == data:
(Pdb) s
> /Users/feixiaoxing/Desktop/test/run.py(10)iterate()
-> return iterate(data-1) +data
(Pdb) s
--Call--
> /Users/feixiaoxing/Desktop/test/run.py(6)iterate()
-> def iterate(data):
(Pdb) s
> /Users/feixiaoxing/Desktop/test/run.py(7)iterate()
-> if 1 == data:
(Pdb) bt
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/bdb.py(400)run()
-> exec cmd in globals, locals
<string>(1)<module>()
/Users/feixiaoxing/Desktop/test/run.py(16)<module>()
-> main()
/Users/feixiaoxing/Desktop/test/run.py(13)main()
-> print iterate(10)
/Users/feixiaoxing/Desktop/test/run.py(10)iterate()
-> return iterate(data-1) +data
> /Users/feixiaoxing/Desktop/test/run.py(7)iterate()
-> if 1 == data:
(Pdb)
是不是还挺简单的。更多的内容,大家可以参考这里,学习更多的pdb调试知识。
代码十行,不如手写一行;手写一行;不如单步一行。愿大家多多练习,多多实践一下。