先举例最为常见的调试方法是:print

deffoo(s):n=int(s)print('>>>n=%d'%n)return10/ndefmain():foo('0')main()

运行结果:

>>>n=0Traceback(mostrecentcalllast):File"/usercode/file.py",line13,in<module>main()File"/usercode/file.py",line10,inmainfoo('0')File"/usercode/file.py",line7,infooreturn10/nZeroDivisionError:integerdivisionormodulobyzero

有时候并不想要print输出信息,只是为了方便看调试值而已,所以,assert可以解决这个问题。


assert(断言):

将print替换

当n != 0 为False时,才会执行'n is zero!'

deffoo(s):n=int(s)assertn!=0,'niszero!'return10/ndefmain():foo('0')

运行结果:

Traceback(mostrecentcalllast):File"/usercode/file.py",line14,in<module>main()File"/usercode/file.py",line11,inmainfoo('0')File"/usercode/file.py",line6,infooassertn!=0,'niszero!'AssertionError:niszero!


logging:

用logging代替print, 可将信息输出到文件中,但我还不懂是哪个文件,怎么找。。。。

logging.info()可以输出一段文本,但并不会主动将文本信息显示在会话框,所以需要加:

logging.basicConfig(level=logging.INFO)

没有在会话框输出logging内容的程序:

importloggings='0'n=int(s)logging.info('n=%d'%n)print(10/n)

运行结果:

Traceback(mostrecentcalllast):File"log_info.py",line6,in<module>print(10/n)ZeroDivisionError:integerdivisionormodulobyzero

在会话框输出logging内容的程序:

importlogginglogging.basicConfig(level=logging.INFO)#####增加这句s='0'n=int(s)logging.info('n=%d'%n)print(10/n)

运行结果:

INFO:root:n=0Traceback(mostrecentcalllast):File"log_dug1.py",line7,in<module>print(10/n)ZeroDivisionError:integerdivisionormodulobyzero

看,可以把文本内容输出到了会话窗口了

INFO:root:n=0


单步运行:pdb

命令:

进入调试状态:python -m pdb 文件名

查看文件内容:l(小写)

查看变量 :p 变量名

调试当前语句:n

退出调试 :q


s='0'n=int(s)j=10/nd=j+1print('d',d)

运行结果:

z@g:~/Documents/Temp/ErrorDebug$python-mpdblog_pdb.py>/home/seeing-zynq/Documents/Temp/ErrorDebug/log_pdb.py(4)<module>()->s='0'(Pdb)l1#!/usr/bin/python2#-*-coding:utf-8-*-34->s='0'5n=int(s)6j=10/n7d=j+18print('d',d)91011(Pdb)n>/home/seeing-zynq/Documents/Temp/ErrorDebug/log_pdb.py(5)<module>()->n=int(s)(Pdb)n>/home/seeing-zynq/Documents/Temp/ErrorDebug/log_pdb.py(6)<module>()->j=10/n(Pdb)nZeroDivisionError:'integerdivisionormodulobyzero'>/home/seeing-zynq/Documents/Temp/ErrorDebug/log_pdb.py(6)<module>()->j=10/n

当运行到了

->j=10/n

就会提出错误信息

ZeroDivisionError:'integerdivisionormodulobyzero'


pdb虽好,但从头到尾开始,有点蛋疼,如果能在指定的地方开始测试就好了,所以,pdb.set_trace()在群众的欢呼中出来了。

#!/usr/bin/python#-*-coding:utf-8-*-importpdbs='0'n=int(s)pdb.set_trace()#运行到这里会自动暂停print(10/n)

运行结果:直接运行.py文件

q@s:~/Documents/Temp/ErrorDebug$pythonset_trace.py>/home/seeing-zynq/Documents/Temp/ErrorDebug/set_trace.py(9)<module>()->print(10/n)(Pdb)pn--------------》查看变量n的值0(Pdb)ps'0'(Pdb)n------------------》单步执行ZeroDivisionError:'integerdivisionormodulobyzero'>/home/seeing-zynq/Documents/Temp/ErrorDebug/set_trace.py(9)<module>()->print(10/n)(Pdb)c--------------------》自动往下执行Traceback(mostrecentcalllast):File"set_trace.py",line9,in<module>print(10/n)ZeroDivisionError:integerdivisionormodulobyzero