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方法,该方法不抛出任何的错误,而且可以输出到文件,它的好处是它允许你指定记录信息的级别,有debuginfowarningerror等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debuginfo就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。下面是一个例子:

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是商业软件,一般需要购买,如果你有高校的教育邮箱,那么恭喜你,可以免费使用它的教育版,整体功能还是很不错的。