Python day 9(6) 调试。Python day 9(6) 调试。

by admin on 2018年9月19日

次第能够同次写了并正常运作的票房价值很粗,基本不越1%。总会发出丰富多彩的bug需要更正。有的bug很粗略,看看错误信息就知晓,有的bug很复杂,我们用了解错时,哪些变量的价是正确的,哪些变量的值是大错特错的,因此,需要一整套调试程序的招来修复bug。

先后会一如既往次等写了并正常运作的票房价值很粗,基本不越1%。总会发出丰富多采的bug需要更正。有的bug很粗略,看看错误信息就清楚,有的bug很复杂,我们用明白错时,哪些变量的值是不利的,哪些变量的价是张冠李戴的,因此,需要一整套调试程序的伎俩来修复bug。

学平:用print()
函数,把可能发问题之变量打印出来看

效仿平:用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 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
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()最好老之流弊是他日还得删掉它,想想程序里四处都是print(),运行结果吗会见含有众多废品信息。

法二:断言(凡是用print()来拉查看的地方,都得就此断言(assert)来取代)

法二:断言(凡是用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')
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的意思是,表达式n != 0应该是True,否则,根据程序运行的逻辑,后面的代码肯定会错。

比方断言失败,assert告知句子我就见面抛出AssertionError

若断言失败,assert告句我就是会抛出AssertionError

1 $ python err.py
2 Traceback (most recent call last):
3   ...
4 AssertionError: n is zero!
1 $ python err.py
2 Traceback (most recent call last):
3   ...
4 AssertionError: n is zero!

 

 

次第中而到处充满着assert,和print()对照可以不顶哪去。不过,启动Python解释器时可以用-O参数来关闭assert

程序中如果四处充斥在assert,和print()相比之下可以不顶啦去。不过,启动Python解释器时可以据此-O参数来关闭assert

1 $ python -O err.py
2 Traceback (most recent call last):
3   ...
4 ZeroDivisionError: division by zero
1 $ python -O err.py
2 Traceback (most recent call last):
3   ...
4 ZeroDivisionError: division by zero

 

 

关后,你得拿装有的assert言辞当成pass来看。

关门后,你可以将所有的assert讲话当成pass来看。

法三:logging

法三:logging

assert比,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 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
输出为:

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)
这就是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'
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来查代码

以参数-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)
1 (Pdb) l
2   1     # err.py
3   2  -> s = '0'
4   3     n = int(s)
5   4     print(10 / n)

 

 

输入指令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)
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 变量名来查看变量

任何时刻都可输入指令p 变量名来查阅变量

1 (Pdb) p s
2 '0'
3 (Pdb) p n
4 0
1 (Pdb) p s
2 '0'
3 (Pdb) p n
4 0

 

 

输入指令q得了调试,退出程序

输入指令q竣工调试,退出程序

1 (Pdb) q
1 (Pdb) q

 

 

这种经过pdb在命令行调试之不二法门理论及是文武双全的,但事实上是最难为了,如果发生一千行代码,要运行至第999执得敲多少令啊。

这种经过pdb在命令行调试的法门理论及是全能的,但实质上是不过费事了,如果发一千行代码,要运行到第999实施得敲多少令啊。

 

 

法五: pdb.set_trace()(这个办法呢是为此pdb,但是不待单步执行,我们特需要import pdb,然后,在恐出错的地方放一个pdb.set_trace(),就足以设置一个断点)

法五: 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)
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接轨运行

运作代码,程序会自行在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
 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单步调试效率要高多,但也大不顶啦去。

斯点子较直接开行pdb单步调试效率要大多,但为强不交啊去。

 

 

法六:IDE

法六:IDE

若果只要于爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好之Python
IDE有:

设若要于爽地设置断点、单步执行,就需要一个支撑调试功能的IDE。目前比较好之Python
IDE有:

Visual Studio
Code:https://code.visualstudio.com/,需要装Python插件。

Visual Studio
Code:https://code.visualstudio.com/,需要安装Python插件。

PyCharm:http://www.jetbrains.com/pycharm/

PyCharm:http://www.jetbrains.com/pycharm/

另外,Eclipse加上pydev插件也堪调剂Python程序。

另外,Eclipse加上pydev插件也可调节Python程序。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图