1. 调试
  2.  
  3. 程序能一次写完并正常执行的概率很小。总会有各种各样的bug需要修正。
  4. 有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时
  5. 哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug
  6.  
  7. 第一种方法:print
  8. 简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看:
  9.  
  10. def foo(s):
  11. n = int(s)
  12. print(">>>n = %d" % n)
  13. return 10 / n
  14.  
  15. def main():
  16. foo("")
  17.  
  18. main()
  19.  
  20. 输出结果:
  21.  
  22. >>>n = 0
  23. Traceback (most recent call last):
  24. File "C:/Python36/test.py", line 9, in <module>
  25. main()
  26. File "C:/Python36/test.py", line 7, in main
  27. foo("")
  28. File "C:/Python36/test.py", line 4, in foo
  29. return 10 / n
  30. ZeroDivisionError: division by zero
  31.  
  32. print()最大的坏处是将来还得删除它,想想程序里到处都是print(),运行结果也会包含很多垃圾信息。
  33. 所以,我们又有第二种方法。
  34.  
  35. 第二种方法:断言
  36.  
  37. 凡是用print()来辅助查看的地方,都可以用断言(assert)来代替:
  38. def foo(s):
  39. n = int(s)
  40. assert n != 0, "n is zero!"
  41. return 10 / n
  42.  
  43. def main():
  44. foo("")
  45.  
  46. main()
  47.  
  48. assert的意思是,表达式 n!=0 应该是True,否则根据程序运行的逻辑,后面的代码肯定会出错。
  49. 如果断言失败,assert语句本身就会抛出AssertionError:
  50.  
  51. Traceback (most recent call last):
  52. File "C:/Python36/test.py", line 9, in <module>
  53. main()
  54. File "C:/Python36/test.py", line 7, in main
  55. foo("")
  56. File "C:/Python36/test.py", line 3, in foo
  57. assert n != 0, "n is zero!"
  58. AssertionError: n is zero!
  59.  
  60. 如果程序中到处充斥着assert,和print()相比也好不到哪去。
  61. 不过启动python解释器可以用-o参数来关闭assert
  62. $ python3 -O err.py
  63. Traceback (most recent call last):
  64. ...
  65. ZeroDivisionError: division by zero
  66.  
  67. 关闭后,你可以把所有的assert语句当成pas来看。
  68.  
  69. 第三种方法:logging
  70. print()替换为logging是第三种方式,和assert比,logging不会抛出错误,而且可以输出到文件。
  71.  
  72. import logging
  73.  
  74. s = ""
  75. n = int(s)
  76. logging.info("n = %d" % n)
  77. print(10 / n)
  78.  
  79. 输出结果:
  80. Traceback (most recent call last):
  81. File "C:/Python36/test.py", line 6, in <module>
  82. print(10 / n)
  83. ZeroDivisionError: division by zero
  84. >>>
  85.  
  86. logging.info()就可以输出一段文本。
  87. 运行,发现除了ZeroDivisionError, 没有任何信息。 怎么回事呢?
  88.  
  89. 别急,在import logging 之后添加一行配置再试试
  90. import logging
  91. logging.basicConfig(level = logging.INFO)
  92.  
  93. s = ""
  94. n = int(s)
  95. logging.info("n = %d" % n)
  96. print(10 / n)
  97.  
  98. 输出结果:
  99. INFO:root:n = 0
  100. Traceback (most recent call last):
  101. File "C:/Python36/test.py", line 7, in <module>
  102. print(10 / n)
  103. ZeroDivisionError: division by zero
  104.  
  105. 看到输出了吧,这就是使用logging的好处,它允许你指定记录信息的级别
  106. debug,info,warning,error等几个级别。
  107. 当我们指定level = INFO时,logging.debug就不起作用了。
  108. 同理,指定level = WAENING后,debuginfo就不起作用了。
  109. 这样一来,拟具可以放心地除数不同级别的I想你,也不用删除,最后统一控制输出哪个级别的信息。
  110. logging的另一个好处就是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
  111.  
  112. 第四种方法:pdb
  113. 第四种方式是移动python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。
  114. 我们先来准备好程序:
  115.  
  116. s = ""
  117. n = int(s)
  118. print(10 / n)
  119.  
  120. $ python3 -m pdb err.py
  121. > /Users/michael/Github/learn-python3/samples/debug/err.py(2)<module>()
  122. -> s = ''
  123.  
  124. 然后逐行输入代码检查。
  125. 这种通过pdb在命令行调试的方法理论上是万能的,但是实在太麻烦了。
  126.  
  127. IDE
  128.  
  129. 如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDEPyCharm
  130.  
  131. http://www.jetbrains.com/pycharm/
  132.  
  133. 另外,Eclipse加上pydev插件也可以调试Python程序。
  134.  
  135. 总结:
  136.  
  137. 写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。
  138.  
  139. 虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。

python的调试的更多相关文章

  1. python基础——调试

    python基础——调试 程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是 ...

  2. 在ubunut下使用pycharm和eclipse进行python远程调试

    我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...

  3. FAQ:Python 断点调试

    Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2  step over ...

  4. python pdb调试以及sublime3快捷键设置

    python pdb调试以及sublime3快捷键设置 pdb调试 如果对gdb比较熟悉的话,pdb就很容易上手.以一个demo快速了解常用的调试命令. def test(a): while True ...

  5. python --端点调试

    python端点调试 左边三角:快速跳到下一个端点 下箭头:单不调试 斜向下箭头:跳到函数内部执行代码

  6. 使用IntelliJ IDEA进行Python远程调试的需求(未完)

    使用IntelliJ IDEA进行Python远程调试的需求(未完) 在研究深度学习Machlearning时,有时候需要借助ubuntu搭建的tensorflow环境,另外也有越来越多的运算程序只能 ...

  7. python基础===利用PyCharm进行Python远程调试(转)

    原文链接:利用PyCharm进行Python远程调试 背景描述 有时候Python应用的代码在本地开发环境运行十分正常,但是放到线上以后却出现了莫名其妙的异常,经过再三排查以后还是找不到问题原因,于是 ...

  8. python错误调试print、assert、logging、pdb、pdb.set_trace()

    世界人都知道,程序总会有bug存在.复杂点的bug一般人不能一眼看出,这就一要一套调试程序的手段. 方法一:使用print()函数直接打印: >>> def foo(s): ... ...

  9. python - 代码调试的好帮手sys._getframe()

    python 的调试,令人非常忧伤,通过将输出路径打印的方式,可以提高很大的方便性: import sys #coding=utf-8 def get_cur_info(): print sys._g ...

随机推荐

  1. C语言第十次博客作业--结构体

    一.PTA实验作业 题目1: 结构体数组按总分排序 1. 本题PTA提交列表 2. 设计思路 求出每名学生的总分 定义i,j循环变量 for i=0 to n for j=0 to 3 p[i].su ...

  2. 001: 徒手建立一个JavaWeb应用

    不借助IDE,我们徒手建立一个JavaWeb应用. web.xml: <?xml version="1.0" encoding="ISO-8859-1"? ...

  3. redis备份与恢复

    1.redis的备份 redis需要远程访问 添加密码进行登录,修改主配置文件添加:requirepass xxx redis-cli -h 127.0.0.1 -p 6379 -a 123456 b ...

  4. 大数据 --> 安装Hadoop-单机模式(1)

    安装Hadoop-单机模式(1) 一.在Ubuntu下创建hadoop组和hadoop用户 1)创建hadoop用户组 sudo addgroup hadoop //添加用户组 2)创建hadoop用 ...

  5. 《UNIX网络编程 卷1:套接字联网API》读书笔记(一):网络编程简介

    概述 要编写通过计算机网络通信的程序,首先要确定这些程序相互通信所用的协议.大多数网络是按照划分成客户和服务器来组织的.本章及后续章节的焦点是TCP/IP协议族,也可称为网际协议族.下图为客户与服务器 ...

  6. C++多线程学习之(一)——并发与多线程

    1 并发 计算机领域的并发指的是在单个系统里同时执行多个独立的任务,而非顺序地进行一些活动. 1.1 并发的途径 多进程并发:将应用程序分为多个独立的进程,它们在同一时刻运行,就像同时进行网页浏览和文 ...

  7. fetch()函数使用的一些技巧

    最近项目用到了一些es6的知识,其中大篇幅在vue框架中使用了fetch()函数,总结了一些使用的技巧: 一, 1,POST带参数)fetch提交json格式的数据到服务器: //fetch替换vue ...

  8. C语言第一次博客作业 陈张鑫

    一,PTA实验作业 题目1.温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代 ...

  9. 20162302 实验一《Java开发环境的熟悉》实验报告

    实 验 报 告 课程:程序设计与数据结构 姓名:杨京典 班级:1623 学号:20162302 实验名称:Java开发环境的熟悉 实验器材:装有Ubuntu的联想拯救者80RQ 实验目的与要求:1.使 ...

  10. Codeforces 240 F. TorCoder

    F. TorCoder time limit per test 3 seconds memory limit per test 256 megabytes input input.txt output ...