前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python调试方法简介

Python调试方法简介

作者头像
AsiaYe
发布2019-11-06 15:29:26
6710
发布2019-11-06 15:29:26
举报
文章被收录于专栏:DBA随笔DBA随笔

Python调试方法

在我们写Python的时候,很难保证一次性写完并且不出错,一个程序写完之后,总有各种各样的bug需要修正,这些错误有的可以通过查看错误信息查看,有的则无法查看。通常的调试bug的方法就是不停的打印,把尽可能多的变量打印出来。但是这样就会出现很多print的垃圾代码,这些代码在正式上线的时候,需要删除掉,造成了不必要的返工。

01

断言assert

凡是用print()来辅助检查的地方,我们都可以使用断言来代替,就像C++里面的断言(assert)一样,

代码语言:javascript
复制
def foo(s):
    n = int(s)
    assert n != , 'n is zero!'
    return  / n

def main():
    foo('0')

如果断言的结果出错,则assert语句本身就会抛出Assertion Error的错误,上面的代码的输出结果如下:

代码语言:javascript
复制
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,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

代码语言:javascript
复制
# err.py
s = '0'
n = int(s)
print(10 / n)

这里我们先给出调试过程,然后再进行解释:

代码语言:javascript
复制
[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就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。下面是一个例子:

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档