内容简介:Python day 9(6) 调试
程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。
法一:用print() 函数, 把可能有问题的变量打印出来看
1 def foo(s):
2 n = int(s)
3 print('>>> n = %d' % n)
4 return 10 / n
5
6 def main():
7 foo('0')
8
9 main()
执行后在输出中查找打印的变量值
1 $ python err.py 2 >>> n = 0 3 Traceback (most recent call last): 4 ... 5 ZeroDivisionError: integer division or modulo by zero
用 print()
最大的坏处是将来还得删掉它,想想程序里到处都是 print()
,运行结果也会包含很多垃圾信息。
法二:断言(凡是用 print()
来辅助查看的地方,都可以用断言(assert)来替代)
1 def foo(s):
2 n = int(s)
3 assert n != 0, 'n is zero!'
4 return 10 / n
5
6 def main():
7 foo('0')
assert
的意思是,表达式 n != 0
应该是 True
,否则,根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败, assert
语句本身就会抛出 AssertionError
1 $ python err.py 2 Traceback (most recent call last): 3 ... 4 AssertionError: n is zero!
程序中如果到处充斥着 assert
,和 print()
相比也好不到哪去。不过,启动 Python 解释器时可以用 -O
参数来关闭 assert
:
1 $ python -O err.py 2 Traceback (most recent call last): 3 ... 4 ZeroDivisionError: division by zero
关闭后,你可以把所有的 assert
语句当成 pass
来看。
法三:logging
和 assert
比, logging
不会抛出错误,而且可以输出到文件
1 import logging
2 logging.basicConfig(level=logging.INFO)
3
4 s = '0'
5 n = int(s)
6 logging.info('n = %d' % n)
7 print(10 / n)
输出为:
1 $ python err.py 2 INFO:root:n = 0 3 Traceback (most recent call last): 4 File "err.py", line 8, in <module> 5 print(10 / n) 6 ZeroDivisionError: division by zero
这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
法四:pdb(启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。)
程序代码为:
1 s = '0' 2 n = int(s) 3 print(10 / n)
然后启动:
1 $ python -m pdb err.py 2 > /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>() 3 -> s = '0'
以参数 -m pdb
启动后,pdb定位到下一步 要执行的代码
-> s = '0'
。输入命令 l
来查看代码
1 (Pdb) l 2 1 # err.py 3 2 -> s = '0' 4 3 n = int(s) 5 4 print(10 / n)
输入命令 n
可以单步执行代码
1 (Pdb) n 2 > /Users/michael/Github/learn-python3/samples/debug/err.py(3)<module>() 3 -> n = int(s) 4 (Pdb) n 5 > /Users/michael/Github/learn-python3/samples/debug/err.py(4)<module>() 6 -> print(10 / n)
任何时候都可以输入命令 p 变量名
来查看变量
1 (Pdb) p s 2 '0' 3 (Pdb) p n 4 0
输入命令 q
结束调试,退出程序
1 (Pdb) q
这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。
法五: pdb.set_trace()(这个方法也是用pdb,但是不需要单步执行,我们只需要 import pdb
,然后, 在可能出错的地方
放一个 pdb.set_trace()
,就可以 设置一个断点
)
1 # err.py 2 import pdb 3 4 s = '0' 5 n = int(s) 6 pdb.set_trace() # 运行到这里会自动暂停 7 print(10 / n)
运行代码,程序会自动在 pdb.set_trace()
暂停并进入pdb调试环境,可以用命令 p
查看变量,或者用命令 c
继续运行
1 $ python err.py 2 > /Users/michael/Github/learn-python3/samples/debug/err.py(7)<module>() 3 -> print(10 / n) 4 (Pdb) p n 5 0 6 (Pdb) c 7 Traceback (most recent call last): 8 File "err.py", line 7, in <module> 9 print(10 / n) 10 ZeroDivisionError: division by zero
这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。
法六:IDE
如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:
Visual Studio Code: https://code.visualstudio.com/ ,需要安装Python插件。
PyCharm: http://www.jetbrains.com/pycharm/
另外, Eclipse 加上 pydev 插件也可以调试Python程序。
以上所述就是小编给大家介绍的《Python day 9(6) 调试》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- iOS常用调试方法:断点调试
- 断点调试和日志调试之间的平衡点:函数计算调试之 Python 篇
- .NET高级调试系列-Windbg调试入门篇
- VisualStudio 通过外部调试方法快速调试库代码
- GDB 调试 Mysql 实战(二)GDB 调试打印
- 使用gdb调试工具上手调试php和swoole源码
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Usability for the Web
Tom Brinck、Darren Gergle、Scott D. Wood / Morgan Kaufmann / 2001-10-15 / USD 65.95
Every stage in the design of a new web site is an opportunity to meet or miss deadlines and budgetary goals. Every stage is an opportunity to boost or undercut the site's usability. Thi......一起来看看 《Usability for the Web》 这本书的介绍吧!
HTML 编码/解码
HTML 编码/解码
UNIX 时间戳转换
UNIX 时间戳转换