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 ...
随机推荐
- C语言第十次博客作业--结构体
一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ...
- 001: 徒手建立一个JavaWeb应用
不借助IDE,我们徒手建立一个JavaWeb应用. web.xml: <?xml version="1.0" encoding="ISO-8859-1"? ...
- redis备份与恢复
1.redis的备份 redis需要远程访问 添加密码进行登录,修改主配置文件添加:requirepass xxx redis-cli -h 127.0.0.1 -p 6379 -a 123456 b ...
- 大数据 --> 安装Hadoop-单机模式(1)
安装Hadoop-单机模式(1) 一.在Ubuntu下创建hadoop组和hadoop用户 1)创建hadoop用户组 sudo addgroup hadoop //添加用户组 2)创建hadoop用 ...
- 《UNIX网络编程 卷1:套接字联网API》读书笔记(一):网络编程简介
概述 要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议.大多数网络是按照划分成客户和服务器来组织的.本章及后续章节的焦点是TCP/IP协议族,也可称为网际协议族.下图为客户与服务器 ...
- C++多线程学习之(一)——并发与多线程
1 并发 计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序地进行一些活动. 1.1 并发的途径 多进程并发:将应用程序分为多个独立的进程,它们在同一时刻运行,就像同时进行网页浏览和文 ...
- fetch()函数使用的一些技巧
最近项目用到了一些es6的知识,其中大篇幅在vue框架中使用了fetch()函数,总结了一些使用的技巧: 一, 1,POST带参数)fetch提交json格式的数据到服务器: //fetch替换vue ...
- C语言第一次博客作业 陈张鑫
一,PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...
- 20162302 实验一《Java开发环境的熟悉》实验报告
实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Java开发环境的熟悉 实验器材:装有Ubuntu的联想拯救者80RQ 实验目的与要求:1.使 ...
- Codeforces 240 F. TorCoder
F. TorCoder time limit per test 3 seconds memory limit per test 256 megabytes input input.txt output ...