调试程序对于开发人员是一项非常重要的技能,它使得我们能够查看程序的运行过程,帮助我们准确的定位程序中的错误。

然而,令人意外的是,无数的Python工程师居然不知道如何对Python代码进行单步调试,遇到问题的时候只能通过print函数打印变量中间值这种低效的方式。究其原因,还是因为这类Python工程师没有意识到Python的强大,仅仅用Python来解决一些很简单的事情,如果总是写非常短小的Python代码,可能确实不需要调试器。但是,如果代码量大,逻辑复杂以后,还是用print函数打印变量中间值的方式进行调试,不但效率低下难以快速定位问题,而且特别打击开发者的自信心。所以,希望各位读者一开始就走在正确的道路上。

只要稍微花点时间,学会了Python的调试器,在以后的工作中,就能够快速的定位各种疑难杂症。在这篇文章中,我们将介绍两个Python调试器,分别是Python标准库自带的pdb和开源的ipdb。

标准库的pdb

pdb是Python自带的一个库,为Python程序提供了一种交互式的源代码调试功能,包含了现代调试器应有的功能,包括设置断点、单步调试、查看源码、查看程序堆栈等。如果读者具有C或C++程序语言背景,则一定听说过gdb。gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。如果读者之前使用过gdb,那么,几乎不用学习就可以直接使用pdb。pdb和gdb保持了一样的用法,这样可以降低工程师的学习负担和Python调试的难度,pdb提供的部分调试命令见下表。

有两种不同的方法启动Python调试器,一种直接在命令行参数指定使用pdb模块启动Python文件,如下所示:

python -m pdb test_pdb.py

另一种方法是在Python代码中,调用pdb模块的set_trace方法设置一个断点,当程序运行自此时,将会暂停执行并打开pdb调试器。

#/usr/bin/python
from __future__ import print_function
import pdbdef sum_nums(n):s=0for i in range(n):pdb.set_trace()s += iprint(s)if __name__ == '__main__':sum_nums(5)

两种方法并没有什么质的区别,选择使用哪一种方式主要取决于应用场景,如果程序文件较短,可以通过命令行参数的方式启动Python调试器;如果程序文件较大,则可以在需要调试的地方调用set_trace方法设置断点。无论哪一种方式,都会启动Python调试器,前者将在Python源码的第一行启动Python调试器,后者会在执行到pdb.set_trace()时启动调试器。

启动Python调试器以后,就可以使用前面的调试命令进行调试,例如,下面这段调试代码,我们先通过bt命令查看了当前函数的调用堆栈,然后使用list命令查看了我们的Python代码,之后使用p命令打印了变量当前的取值,最后使用n执行下一行Python代码。

lmx@host1:~/temp$ python test_pdb.py
> test_pdb.py(9)sum_nums()
-> s += i
(Pdb) bttest_pdb.py(13)<module>()
-> sum_nums(5)
> test_pdb.py(9)sum_nums()
-> s += i
(Pdb) list45     def sum_nums(n):6         s=07         for i in range(n):8             pdb.set_trace()9  ->         s += i10             print(s)1112     if __name__ == '__main__':13         sum_nums(5)
[EOF]
(Pdb) p s
0
(Pdb) p i
0
(Pdb) n
> test_pdb.py(10)sum_nums()
-> print(s)

开源的ipdb

ipdb是一个开源的Python调试器,它和pdb有相同的接口,但是,它相对于pdb,具有语法高亮、tab补全、更友好的堆栈信息等高级功能。ipdb之于pdb,就相当于IPython之于Python,虽然都是实现相同的功能,但是,在易用性方面做了很多的改进。如下所示:

需要注意的是,pdb是Python的标准库,不用安装就可以直接使用。而ipdb是一个第三方的库,因此,需要使用pip先安装,然后才能使用:

pip install ipdb

将我们前面的例子,改为使用ipdb进行调试以后,代码就变成了下面这样:

from __future__ import print_function
import ipdbdef sum_nums(n):s=0for i in range(n):ipdb.set_trace()s += iprint(s)if __name__ == '__main__':sum_nums(5)

除了使用pdb和ipdb以外,如果读者使用PyCharm进行编程,则可以使用PyCharm的图形界面进行调试。PyCharm的图形界面的使用和显示都更加友好,几乎是傻瓜式操作。为了节省篇幅,PyCharm的调试功能在这里就不再介绍。

Python之pdb代码调试相关推荐

  1. python使用 pdb 进行调试--- python -m pdb xxx.py 即可 和gdb使用一样

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

  2. pdb+ipdb 调试 Python代码

    pdb+ipdb 调试 Python代码 pdb 和 ipdb 的主要作用是用于 Python 程序的单步调试,Python 的调试可参考链接. ipdb exports functions to a ...

  3. python pdb 基础调试

    当手边没有IDE,面对着python调试犯愁时,你就可以参考下本文:(pdb 命令调试) 参考:http://docs.python.org/library/pdb.html 和 (pdb)help ...

  4. 【转】Python 代码调试技巧

    原文网址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythondebugger/ Debug 对于任何开发人员都是一项非常重要的技能,它能够帮助 ...

  5. linux可以生成pdb调试信息吗,Linux通过使用pdb简单调试python计划

    python自带的调试工具库:pdb # -*- coding:utf-8 -*- def func(num): s = num * 10 return s if __name__ == '__mai ...

  6. python断点调试从哪里看数据_Python Pdb 断点调试 - 简明教程

    Pdp 调试 pdb是一种在命令行下面调试的古老的方法,虽然没有现代IDE集成的debug功能强大,但是简单通用,大部分语言都支持. main.py 1 for x in range(10): 2 p ...

  7. 用PDB库调试Python程序

    Python自带的pdb库,发现用pdb来调试程序还是很方便的,当然了,什么远程调试,多线程之类,pdb是搞不定的. 用pdb调试有多种方式可选: 1. 命令行启动目标程序,加上-m参数,这样调用my ...

  8. Python 调试工具 PDB(Linux 环境下调试)

    转载:http://blog.163.com/gjx0619@126/blog/static/12740839320114995947700/ 在python中使用pdb模块可以进行调试 import ...

  9. python 除数不能为零的报错有哪些_【社区精选40】Python错误处理及代码调试方法(文末赠书中奖名单)...

    本文整理自爱数据学院中的问答 更多精彩问答,进入下方社区网站查看 http://www.lovedata.cn/invitation 社区精选话题 第40期 Python错误处理及代码调试方法 一次写 ...

最新文章

  1. 关于MFC单选框的使用临时记录,稍后编辑
  2. 图解opengl曲线和曲面绘制
  3. 为什么精准营销难谈精准?
  4. smartform 打印预览时转PDF查看
  5. echart饼图标签重叠_Echarts 解决饼图文字过长重叠的问题
  6. php 判断接受邮件地址,PHP:电子邮件验证并接受来自特定域的电子邮件地址
  7. make,makefile,cmake“暴力编译法”的个人经验或理解。
  8. Emlog文章特色图生成插件分享
  9. POJ_1088 滑雪(记忆型DP+DFS)
  10. 漫画:分布式缓存服务器扛不住了怎么办?| 技术头条
  11. 【论文解读】结合概率图模型和神经网络做图片问答
  12. python 装饰器原理_python3 property装饰器实现原理与用法示例
  13. qpushbutton设置两个图标_苹果手机的月亮图标有什么功能?原来这么好用,不会真的太浪费了...
  14. 软考中级——系统集成项目管理工程师 知识点思维导图
  15. 嘉立创 PCB 生产流程
  16. wps文字表格制作拼音田字格模板_WPS文字怎么制作田字格 WPS文字制作田字格的方法...
  17. 甘氨胆酸(Cholylglycine)小麦麦清白蛋白纳米粒|叶酸偶联牛血清白蛋白负载卡铂和紫杉醇靶向纳米粒
  18. vue 中使用canvas画简单的线条动画效果
  19. SDN相关组织——ONF
  20. css页眉标签,CSS – 带页眉和页脚的100%高度

热门文章

  1. java 离线gis开发_Web GIS离线解决方案
  2. 服务器临时文件无法删掉,“internet临时文件”始终删不掉如何解决?临时文件无法删除的清理方法...
  3. 浅析硬件“好声音”:喇叭技术指标及选型指南
  4. 电脑版CSDN如何查看[我的收藏]/[我的关注]
  5. 农地里怒放的生命:常锋植保无人机
  6. 操作Doris数据库错误记录——insert has filtered data in strict mode
  7. php web裁剪图片上传,WEB前端实现裁剪上传图片功能
  8. 关于Socket类型中SOCK_STREAM和SOCK_DGRAM区别
  9. IOS 解决WKWebView加载本地html资源文件异常处理
  10. 每日一问 --欧拉公式是什么?