如何调试Python程序

1. print大法

print大法一定是初学者首选。

觉得哪里有问题,就把哪里的变量打印出来看看。

 
  1. 优点:

  2. 简单易行

  3.  
  4. 缺点:

  5. release前要全注释掉,增加重复工作量,不能忍

2. logging工具

将print改为logging.debug(),就可以通过配置level达到log分级输出。

DEBUG

 
  1.  
  2. import logging

  3. logging.basicConfig(

  4. level=logging.WARNING,

  5. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

  6. datefmt='%a, %d %b %Y %H:%M:%S'

  7. )

  8. logging.debug('This is debug message')

  9. logging.info('This is info message')

  10. logging.warning('This is warning message')

运行发现,log只显示warning信息。

加上filename参数还能很方便的支持输出log到文件,比如:

 
  1.  
  2. import logging

  3. logging.basicConfig(

  4. level=logging.WARNING,

  5. format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',

  6. datefmt='%a, %d %b %Y %H:%M:%S',

  7. filename='test.log',

  8. filemode='w')

从此我就喜欢上logging,只在代码编写初期顺手用一下print

不过有时候我预先并不知道问题在哪里,我也不是大牛,我羡慕那些用着支持断点调试开发环境的猿类。直到我遇到它。

3. pdb

pdb是python自带的调试库,当我想让程序停在某个地方,然后一步一步运行程序并且查看变量时,我只需要加入下面的代码

 
  1.  
  2. a=1

  3. b=2

  4. import pdb

  5. pdb.set_trace()

  6. c=b*a

  7. d=b/a

  8. print d,c

然后有n(ext),s(tep),c(ontinue), b(reak),cl(ear)等一系列命令支持,我就等于有了一套支持断点调试的开发环境。

可是这里还是有个问题,就是刚才加入的调试代码在release前还要注释掉。

pdb的作者一定也考虑了这个问题。因此有了命令形式进入调试模式。

python -m pdb script.py

代码会在一开始停住,相当于你在程序开始运行第一行加了个断点。然后用命令b(reak)在你希望的行上加断点,然后c(ontinue)就可以啦。

用了pdb,妈妈再也不用担心我调程序了。可是爸爸有疑问了。有时候程序运行好久忽然崩溃了,我还不知道它崩在哪里,意思就是断点都不知道设在哪,怎么办。

怎样在崩溃时自动进入调试模式,这个问题困扰我很久,直到我学会上stackoverflow,发现那个牛人聚集的地方。

4. ipython

当你在有问题的代码前加上这段代码,它就可以帮助你在异常时进入ipdb调试模式。前提是你要安装ipython。

 
  1.  
  2. import sys

  3. from IPython.core import ultratb

  4. sys.excepthook = ultratb.FormattedTB(mode='Verbose',

  5. color_scheme='Linux', call_pdb=1)

你也可以把上面的代码保存成crash_debug.py,然后在你出问题的文件test.py头上加上

 

 
  1.  
  2. import crash_debug

  3. for i in range(10,-1,-1):

  4. y=1/i

执行python test.py后输出如下:

你可能感兴趣的:(技术类)