【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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调试知识。
代码十行,不如手写一行;手写一行;不如单步一行。愿大家多多练习,多多实践一下。