Python调试方法简介
- 2019 年 11 月 6 日
- 筆記
Python调试方法
在我们写Python的时候,很难保证一次性写完并且不出错,一个程序写完之后,总有各种各样的bug需要修正,这些错误有的可以通过查看错误信息查看,有的则无法查看。通常的调试bug的方法就是不停的打印,把尽可能多的变量打印出来。但是这样就会出现很多print的垃圾代码,这些代码在正式上线的时候,需要删除掉,造成了不必要的返工。
01
断言assert
凡是用print()来辅助检查的地方,我们都可以使用断言来代替,就像C++里面的断言(assert)一样,
def foo(s): n = int(s) assert n != , 'n is zero!' return / n def main(): foo('0')
如果断言的结果出错,则assert语句本身就会抛出Assertion Error的错误,上面的代码的输出结果如下:
Traceback (most recent call last): File "<stdin>", line , in <module> File "<stdin>", line , in foo AssertionError: n is zero!
如果我们在程序中到处写满了assert,似乎和print的结果也很像,没有真正起到优化的作用,但是在python中,当我们启用assert的时候,运行程序的时候,我们可以通过一个简单的-o参数将assert的输出给屏蔽掉。
02
PDB
除了assert之外,我们还可以启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:
# err.py s = '0' n = int(s) print(10 / n)
这里我们先给出调试过程,然后再进行解释:
[root@dev01 yeyz_shell]# python -m pdb err.py > /root/yeyz_shell/err.py()<module>() -> s = '0' (Pdb) l # err.py -> s = '0' n = int(s) print( / n) [EOF] (Pdb) n > /root/yeyz_shell/err.py()<module>() -> n = int(s) (Pdb) n > /root/yeyz_shell/err.py()<module>() -> print( / n) (Pdb) p s '0' (Pdb) p n (Pdb) q
上面的调试具体过程如下,首先第一行代码中,我们启动了pdb调试方法,我们可以看到输出定位到了s='0'这一行,也就是上述代码的第3行,紧接着我们使用小写的L键来查看当前的位置,从返回中我们可以清楚的看到程序现在执行到了第s='0'这一行,接着我们点击按键n,启动单步调试,从第12行代码的结果可以看到,程序已经前进了一步,连续点击n键,可以连续单行调试。如果在调试的过程中,需要查看变量的值,我们可以使用p+变量名的方法来查看,如代码16行和18行所示,可以查看上述代码中变量的值,最后,我们可以通过q键退出单步调试。
03
其他调试方法
除了上面说的两种方法,我们还可以使用logging方法,该方法不抛出任何的错误,而且可以输出到文件,它的好处是它允许你指定记录信息的级别,有debug
,info
,warning
,error
等几个级别,当我们指定level=INFO
时,logging.debug
就不起作用了。同理,指定level=WARNING
后,debug
和info
就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。下面是一个例子:
import logging logging.basicConfig(level=logging.INFO) s = '0' n = int(s) logging.info('n = %d' % n) print( / n) $ python err.py INFO:root:n = Traceback (most recent call last): File "err.py", line , in <module> print( / n) ZeroDivisionError: division by zero
当然,如果要想比较爽地设置断点、单步执行,IDE是不二之选,就需要一个支持调试功能的IDE。目前比较好的Python IDE有:
Visual Studio Code:https://code.visualstudio.com/,
需要安装Python插件。
PyCharm:http://www.jetbrains.com/pycharm/
Pycharm是商业软件,一般需要购买,如果你有高校的教育邮箱,那么恭喜你,可以免费使用它的教育版,整体功能还是很不错的。