注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

如何调试python 程序  

2012-05-10 11:37:00|  分类: Web技术-Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

如何调试python 程序

pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能,主要特性包括设置断点、单步调试、进入函数调试、查看当前代码、查看栈片段、动态改变变量的值等

pdb 常用命令

break 或 b                    设置断点设置断点

continue 或                   c继续执行程序

list 或 l                          查看当前行的代码段

step 或 s                        进入函数

return 或 r                   执行代码直到从当前函数返回

exit 或 q                        中止并退出

next 或 n                       执行下一行

pp                                 打印变量的值

help                               帮助

 

下面结合具体的实例讲述如何使用 pdb 进行调试。

 1 开启一个调试

import time,pdb
#计算
def test(h):
    t = h*3600
    t = time.time()+t
    t = time.localtime(t)
    return t
#输出
a = 'aa'
pdb.set_trace() #设置调试点
b = 'bb'
c = 'cc'

 运行结果说明:直接运行脚本,会停留在 pdb.set_trace() 处,选择 n+enter 可以执行当前的 statement。在第一次按下了 n+enter 之后可以直接按 enter 表示重复执行上一条 debug 命令。
> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) n+enter
> d:\pythondev\code\s.py(13)<module>()
-> c = 'cc'
(Pdb)
--Return--
> d:\pythondev\code\s.py(13)<module>()->None
-> c = 'cc'
(Pdb)

退出 debug:使用 quit 或者 q 可以退出当前的 debug,但是 quit 会以一种非常粗鲁的方式退出程序,其结果是直接 crash。

使用 c 可以停止当前的 debug 使程序继续执行。如果在下面的程序中继续有 set_statement() 的申明,则又会重新进入到 debug 的状态,读者可以在代码 print final 之前再加上 set_trace() 验证。

 

2 打印变量

> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) n+enter
> d:\pythondev\code\s.py(13)<module>()
-> c = 'cc'
(Pdb) p b
'bb'
(Pdb)

打印变量的值:如果需要在调试过程中打印变量的值,可以直接使用 p 加上变量名,但是需要注意的是打印仅仅在当前的 statement 已经被执行了之后才能看到具体的值,否则会报 NameError: < exceptions.NameError … ....> 错误。

 

3 查看代码

> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) l
  7          return t
  8      
  9      #输出
 10      a = 'aa'
 11      pdb.set_trace() #设置调试点
 12  ->    b = 'bb'
 13      c = 'cc'
[EOF]
(Pdb)

显示代码:在 debug 的时候不一定能记住当前的代码块,如要要查看具体的代码块,则可以通过使用 list 或者 l 命令显示。list 会用箭头 -> 指向当前 debug 的语句。

 

4 调试函数

代码:

import time,pdb
#计算
def test(h):
    t = h*3600
    t = time.time()+t
    t = time.localtime(t)
    return t

#输出
a = 'aa'
pdb.set_trace() #设置调试点
b = 'bb'
test(2)
c = 'cc'

如果直接使用 n 进行 debug 则到 test(2) 这句的时候会将其当做普通的赋值语句处理,进入到 c='cc'。

> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) n
> d:\pythondev\code\s.py(13)<module>()
-> test(2)
(Pdb) n
> d:\pythondev\code\s.py(14)<module>()
-> c = 'cc'
(Pdb)

 

如果想要对函数进行 debug 如何处理呢 ? 可以直接使用 s 进入函数块。函数里面的单步调试与上面的介绍类似。如果不想在函数里单步调试可以在断点处直接按 r 退出到调用的地方。

> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) n+enter#初次命令
> d:\pythondev\code\s.py(13)<module>()
-> test(2)
(Pdb) s #进入函数命令
--Call--
> d:\pythondev\code\s.py(3)test()
-> def test(h):
(Pdb)  #注意这里直是按的是键盘上的“Enter”键来进行的命令(参看上文中:1 开启一个调试 “运行结果说明”)
> d:\pythondev\code\s.py(4)test()
-> t = h*3600
(Pdb) #注意这里直是按的是键盘上的“Enter”键来进行的命令(参看上文中:1 开启一个调试 “运行结果说明”)
> d:\pythondev\code\s.py(5)test()
-> t = time.time()+t
(Pdb) r#返回调用处命令
--Return--
> d:\pythondev\code\s.py(7)test()->time.str..._isdst=0)
-> return t
(Pdb)  #注意这里直是按的是键盘上的“Enter”键来进行的命令(参看上文中:1 开启一个调试 “运行结果说明”)
> d:\pythondev\code\s.py(14)<module>()
-> c = 'cc'
(Pdb)

5 动态改变值

在调试的时候动态改变值 。在调试的时候可以动态改变变量的值,具体如下实例。需要注意的是下面有个错误,原因是 b 已经被赋值了,如果想重新改变 b 的赋值,则应该使用! B。

> d:\pythondev\code\s.py(12)<module>()
-> b = 'bb'
(Pdb) b='ss'
*** The specified object "='ss'" is not a function
or was not found along sys.path.
(Pdb) !b='ss'
(Pdb) p b
'ss'
(Pdb)

 

pdb 调试有个明显的缺陷就是对于多线程,远程调试等支持得不够好,同时没有较为直观的界面显示,不太适合大型的 python 项目。

而在较大的 python 项目中,这些调试需求比较常见,因此需要使用更为高级的调试工具。接下来将介绍 PyCharm IDE 的调试方法 .

 

更多详情参看:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/


另外附PyCharm的下载地址:http://www.jetbrains.com/pycharm/download/index.html

 

 

  评论这张
 
阅读(750)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017