python的调试
调试 程序能一次写完并正常执行的概率很小。总会有各种各样的bug需要修正。
有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时
哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。 第一种方法:print
简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看: def foo(s):
n = int(s)
print(">>>n = %d" % n)
return 10 / n def main():
foo("") main() 输出结果: >>>n = 0
Traceback (most recent call last):
File "C:/Python36/test.py", line 9, in <module>
main()
File "C:/Python36/test.py", line 7, in main
foo("")
File "C:/Python36/test.py", line 4, in foo
return 10 / n
ZeroDivisionError: division by zero 用print()最大的坏处是将来还得删除它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。
所以,我们又有第二种方法。 第二种方法:断言 凡是用print()来辅助查看的地方,都可以用断言(assert)来代替:
def foo(s):
n = int(s)
assert n != 0, "n is zero!"
return 10 / n def main():
foo("") main() assert的意思是,表达式 n!=0 应该是True,否则根据程序运行的逻辑,后面的代码肯定会出错。
如果断言失败,assert语句本身就会抛出AssertionError: Traceback (most recent call last):
File "C:/Python36/test.py", line 9, in <module>
main()
File "C:/Python36/test.py", line 7, in main
foo("")
File "C:/Python36/test.py", line 3, in foo
assert n != 0, "n is zero!"
AssertionError: n is zero! 如果程序中到处充斥着assert,和print()相比也好不到哪去。
不过启动python解释器可以用-o参数来关闭assert:
$ python3 -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero 关闭后,你可以把所有的assert语句当成pas来看。 第三种方法:logging
把print()替换为logging是第三种方式,和assert比,logging不会抛出错误,而且可以输出到文件。 import logging s = ""
n = int(s)
logging.info("n = %d" % n)
print(10 / n) 输出结果:
Traceback (most recent call last):
File "C:/Python36/test.py", line 6, in <module>
print(10 / n)
ZeroDivisionError: division by zero
>>> logging.info()就可以输出一段文本。
运行,发现除了ZeroDivisionError, 没有任何信息。 怎么回事呢? 别急,在import logging 之后添加一行配置再试试
import logging
logging.basicConfig(level = logging.INFO) s = ""
n = int(s)
logging.info("n = %d" % n)
print(10 / n) 输出结果:
INFO:root:n = 0
Traceback (most recent call last):
File "C:/Python36/test.py", line 7, in <module>
print(10 / n)
ZeroDivisionError: division by zero 看到输出了吧,这就是使用logging的好处,它允许你指定记录信息的级别
有debug,info,warning,error等几个级别。
当我们指定level = INFO时,logging.debug就不起作用了。
同理,指定level = WAENING后,debug和info就不起作用了。
这样一来,拟具可以放心地除数不同级别的I想你,也不用删除,最后统一控制输出哪个级别的信息。
logging的另一个好处就是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。 第四种方法:pdb
第四种方式是移动python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
我们先来准备好程序: s = ""
n = int(s)
print(10 / n) $ python3 -m pdb err.py
> /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
-> s = '' 然后逐行输入代码检查。
这种通过pdb在命令行调试的方法理论上是万能的,但是实在太麻烦了。 IDE 如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm: http://www.jetbrains.com/pycharm/ 另外,Eclipse加上pydev插件也可以调试Python程序。 总结: 写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。 虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。
python的调试的更多相关文章
- python基础——调试
python基础——调试 程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是 ...
- 在ubunut下使用pycharm和eclipse进行python远程调试
我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...
- FAQ:Python 断点调试
Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2 step over ...
- python pdb调试以及sublime3快捷键设置
python pdb调试以及sublime3快捷键设置 pdb调试 如果对gdb比较熟悉的话,pdb就很容易上手.以一个demo快速了解常用的调试命令. def test(a): while True ...
- python --端点调试
python端点调试 左边三角:快速跳到下一个端点 下箭头:单不调试 斜向下箭头:跳到函数内部执行代码
- 使用IntelliJ IDEA进行Python远程调试的需求(未完)
使用IntelliJ IDEA进行Python远程调试的需求(未完) 在研究深度学习Machlearning时,有时候需要借助ubuntu搭建的tensorflow环境,另外也有越来越多的运算程序只能 ...
- python基础===利用PyCharm进行Python远程调试(转)
原文链接:利用PyCharm进行Python远程调试 背景描述 有时候Python应用的代码在本地开发环境运行十分正常,但是放到线上以后却出现了莫名其妙的异常,经过再三排查以后还是找不到问题原因,于是 ...
- python错误调试print、assert、logging、pdb、pdb.set_trace()
世界人都知道,程序总会有bug存在.复杂点的bug一般人不能一眼看出,这就一要一套调试程序的手段. 方法一:使用print()函数直接打印: >>> def foo(s): ... ...
- python - 代码调试的好帮手sys._getframe()
python 的调试,令人非常忧伤,通过将输出路径打印的方式,可以提高很大的方便性: import sys #coding=utf-8 def get_cur_info(): print sys._g ...
随机推荐
- 【jQuery】 JQ和HTML以及JQ遍历元素
JQ & HTML JQ作为一个JS库,很好地继承了JS和HTML互动的特点,并且还给出了包装得更好,操作层次更高的方法.和之前JQ的内容一样,方法的表现形式是$(selector).acti ...
- Hie with the Pie
Hie with the Pie poj-3311 题目大意:n+1个点,伪旅行商问题. 注释:n<=10. 想法:咳咳,第一道状压dp,下面我来介绍一下状压dp. 所谓dp,就是动态性决策规划 ...
- java日期格式大全 format SimpleDateFormat
http://www.cnblogs.com/loveyakamoz/archive/2011/08/18/2145047.html
- MongoDB系列三(Spring集成方案).
一.前言 MongoDB是最为流行的开源文档数据库之一.Spring Data MongoDB提供了三种方式在Spring应用中使用MongoDB: 通过注解实现对象-文档映射: 使用MongoTem ...
- Kettle 初始配置数据量类型资源库
PS:有段时间不使用Kettle了,但总遇到小伙伴问起,写一篇记录下. 文档使用版本:KETTLE 7.0 Kettle资源库可分为文件与数据库,文件型只需要配置好存放路径就行,这边介绍的是配置数据库 ...
- 网络1712--c语言第二次作业总结
1.作业亮点 1.1在调试问题方面有明显进步,变量声明方面有所改变,没有发现大面积抄袭现象. 1.2 以下几位同学博文写的较为优秀,可作为范例供大家参考 田亚琴--代码格式良好,思路清晰,调试部分图文 ...
- linux服务器操作系统,在相同环境下,哪个做lamp服务器更稳定点?哪个版本更稳定?
随着国内WEB服务越来越多,如何才能选择一个合适的linux服务器操作系统?在国内用的最多的好像是红帽子系列也就是red hat系列,但有些版本缺乏稳定性.新手在选择操作系统的时候最好只用偶数版本,还 ...
- 《高级软件测试》Windows平台Jira的配置
昨天完成了Jira的下载,很开心地去睡觉等明天天亮秒配环境愉快进行使用,撰写文档,开始徜徉于软件管理测试实践,早日走向代码巅峰. 我们把安装和配置的过程来走一遍. 安装完成汤姆猫长这样子: 安装Jir ...
- Codeforces 240 F. TorCoder
F. TorCoder time limit per test 3 seconds memory limit per test 256 megabytes input input.txt output ...
- RAID 损坏后如何对物理硬盘做完整镜像
"磁盘阵列是由很多价格较便宜的磁盘,组合成一个容量巨大的磁盘组,利用个别磁盘提供数据所产生加成效果提升整个磁盘系统效能.利用这项技术,将数据切割成许多区段,分别存放在各个硬盘上." ...