【转自:http://blog.csdn.net/luckeryin/article/details/4477233

本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序

源码例子

例如,有模拟税收计算的程序:

#!/usr/bin/python 
def debug_demo(val): 
                if val <= 1600 : 
                                print "level 1" 
                                print 0 
                elif val <= 3500 : 
                                print "level 2" 
                                print (val - 1600) * 0.05 
                elif val <= 6500 : 
                                print "level 3" 
                                print (val - 3500) * 0.10 + (3500-1600) * 0.05 
                else: 
                                print "level 4" 
                                print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 
#~def debug_demo                 
if __name__ == "__main__": 
                debug_demo(4500)

debug_demo函数计算4500的入账所需的税收。

如何调试?

1.加入断点

在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试)。

#!/usr/bin/python 
_DEBUG=True 
def debug_demo(val): 
                if _DEBUG == True: 
                                import pdb 
                                pdb.set_trace() 
                if val <= 1600 : 
                                print "level 1" 
                                print 0 
                elif val <= 3500 : 
                                print "level 2" 
                                print (val - 1600) * 0.05 
                elif val <= 6500 : 
                                print "level 3" 
                                print (val - 3500) * 0.10 + (3500-1600) * 0.05 
                else: 
                                print "level 4" 
                                print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 
#~def debug_demo                 
if __name__ == "__main__": 
                debug_demo(4500)

2.开始运行调试

运行程序./debug_demo.py,得到

> /usr/local/qspace/user_network/debug_demo.py(7)debug_demo() 
-> if val <= 1600 : 
(Pdb)

-> val <= 1600 : 指示当前执行的语句,(Pdb)等待你的调试指令. pdb的指令很丰富,输入h指令可以查看指令的使用方法。下面简单介绍常用指令:

查看代码上下文,l(小写L)

(Pdb) l 
    2         _DEBUG=True 
    3         def debug_demo(val): 
    4                         if _DEBUG == True: 
    5                                         import pdb 
    6                                         pdb.set_trace() 
    7    ->                 if val <= 1600 : 
    8                                         print "level 1" 
    9                                         print 0 
  10                         elif val <= 3500 : 
  11                                         print "level 2" 
  12                                         print (val - 1600) * 0.05 
(Pdb)

左边是行号,右边是代码正文。

监视变量:p 变量名

(Pdb) p val 
4500 
(Pdb)

单步执行: n

-> elif val <= 3500 : 
(Pdb) l  
  5                                         import pdb  
  6                                         pdb.set_trace()  
  7                         if val <= 1600 :  
  8                                         print "level 1"  
  9                                         print 0 
10    ->                 elif val <= 3500 : 
11                                         print "level 2" 
12                                         print (val - 1600) * 0.05 
13                         elif val <= 6500 : 
14                                         print "level 3" 
15                                         print (val - 3500) * 0.10 + (3500-1600) * 0.05

加入断点:b 行号

(Pdb) b 14

运行到断点: c

(Pdb) c 
> /***** 
-> print "level 3" 
(Pdb) l  
  9                                         print 0 
10                         elif val <= 3500 : 
11                                         print "level 2" 
12                                         print (val - 1600) * 0.05 
13                         elif val <= 6500 : 
14 B->                                 print "level 3" 
15                                         print (val - 3500) * 0.10 + (3500-1600) * 0.05 
16                         else: 
17                                         print "level 4" 
18                                         print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05 
19

执行到函数返回前: r

(Pdb) r 
level 3 
195.0 
--Return-- 
> /****()

->None 
-> print (val - 3500) * 0.10 + (3500-1600) * 0.05 
(Pdb)

说明:

pdb还有很多其他很多有用的指令,读者可以自行探索。输入h,h 命令。就可以得到命令的详细帮助。

不过,我个人认为一般无需启动这种调试方法,一般使用日志输出进行调试即可,除非遇到了非常微妙的错误。这时,单步调试的威力便显示出来了

python程序的调试方法的更多相关文章

  1. [转] python程序的调试方法

    qi09 原文 python程序的调试方法 本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序 源码例子 例如,有模拟税收计算的程序: #!/usr/bin/python de ...

  2. Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...

  3. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

  4. Python入门(一):PTVS写Python程序,调试模式下input()提示文字乱码问题

    前两天写了Python入门(一),里面提到,使用VS2013+PTVS进行Python开发. 就在准备为第二篇写个demo的时候,发现了一个问题,各种解决无果,有些纠结 Python中输入函数是inp ...

  5. 添加树莓派python程序自启动的方法

    首先确保网络,硬件连接都正确.保证py程序可以正确运行. 然后远程登录树莓派 打开这个文件来修改自启动,网上有很多方法都是新建一个脚本来完成的.由于我们是自启动python文件,所以命令会有不同. 如 ...

  6. linux环境下python的pdb调试方法

    一些常用指令: h(elp) [comman]  #打印可用指令及帮助信息 r(eturn)  #运行代码直到下一个断点或当前函数返回 b(reak) [[filename:]lineno | fun ...

  7. js程序的调试方法

  8. Python Flask API实现方法-测试开发【提测平台】阶段小结(一)

    微信搜索[大奇测试开],关注这个坚持分享测试开发干货的家伙. 本篇主要是对之前几次分享的阶阶段的总结,温故而知新,况且虽然看起来是一个小模块简单的增删改查操作,但其实涉及的内容点是非常的密集的,是非常 ...

  9. 二十四、【开源】EFW框架Winform前端开发之项目结构说明和调试方法

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

随机推荐

  1. sql server手工注入

    sql server手工注入 测试网站testasp.vulnweb.com 1. http://testasp.vulnweb.com/showforum.asp?id=0 http://testa ...

  2. hdoj-2025

    #include "stdio.h"#include "string.h"void sort(char ch[],int count[],int n,int f ...

  3. HTML的常用标签

    <!--编写HTML常用的标签 文字版面的编辑 格式标签 文本标签 超链接和锚点 图像和图像地图 --> <!DOCTYPE html PUBLIC "-//W3C//DT ...

  4. 1、网页制作Dreamweaver(界面、基本操作、锚点、表格)

    界面 网页的界面html由两部分组成:<head>和<body>,<title>放在<head>中 1.以下是<head>部分的解释: &l ...

  5. java学习第十天

    第十二次课 目标 一维数组(创建访问) 一.概念与特点 1.概念 相同数据类型的有序集合[] 数组名: 容器的名字 元素:  下标变量,数组名[下标] 长度:  length 下标:   位置.索引  ...

  6. 第二个Sprint冲刺第九天

    讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 工作:接着昨天的任务

  7. ios layoutsubView 何时被调用

    -layoutSubviews方法:这个方法,在UIView中默认没有做任何事情,需要子类进行重写.UIView是一个纯净的视图,里面没有任何子控件,所以不会做什么事情.一般系统自带控件中有子控件的都 ...

  8. Qt的quit(),exit()以及close()事件捕获

         使用QT编辑界面,其中带来很大方便的一点就是Qt中自带丰富的.种类齐全的类及其功能函数,程序员可以在编辑程序的过程中简单地直接调用.关于窗口关闭的操作,在这里指出常用的三个槽,即quit() ...

  9. 【avalon】data

    if (root.dataset) { avalon.fn.data = function (name, val) { name = name && camelize(name) va ...

  10. 应用Druid监控SQL语句的执行情况(转)

    Druid是什么? Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.JBo ...