python 调试: print / assert / logging / pdb
先举例最为常见的调试方法是: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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。