Python 程序如何高效地调试?
Python在debug方面的支持还是不错的,在明确代码意义的情况下,通过log、print和assert分析错误原因,配合单元测试可以很高效。然而,实际工作中大量代码很可能出自他人之手,这种情况下,使用debugger就显得更加高效了。
一、在控制台下进行程序调试
PDB
如果你熟悉命令行调试工具(例如gdb、lldb),那么使用Python中的PDB将获得非常好的体验,PDB不仅支持项目启动时进行调用,也支持在Python shell中交互式调试;功能上,支持断点、步进、异常捕获和解决、变量查看、变量改写、栈查看甚至字节码查看等。
举个PDB断点调试的例子:
用文本编辑器新建一个文档,就命名为debug1.py吧,输入最简单的Python代码片段:
然后运行这个脚本,Windows下面这样运行 :
python debug1.py
然后执行到pdb.set_trace()这句后会自动进入断点调试模式,屏幕会显示类似的信息:
PDB显示目前的断点位置,然后你就可以使用PDB调试命令了。
Tips:其他常用命令有:
pp,打印
n,下一步,执行下一步
s,步进,一步步的执行
l,列出,显示断点周围的源代码
c,继续,继续程序的运行
r,返回,继续直到当前函数返回
由PDB引入的VIM、Emacs工具都能很好地实现类似lldb和gdb的效果。同时,结合IPython这一扩展功能shell,其中的魔法命令能够更好地帮助程序调试。这是一般*nix环境下常见的调试组合,配合配置良好的文本编辑工具都能实现不错的类IDE体验。PDB更能进行远程调试,即对远端(如服务器上正在运行着的Python代码)进行调试。几乎所有的debugger工具都是在PDB的功能基础上进行用户界面上的提升。
此外,对于部分框架,尤其是Web框架,进行调试往往需要结合具体的上下文环境(例如Django的开发调试测试需要上下文环境等),PDB交互式调试可以直接挂载在对应的交互环境中(如Django shell)。
Pudb
如果你觉得这样太原始,那么可以尝试pudb,它是基于控制台的debug图形化debugger工具,稍微比pdb直观一点,但仅可以在Linux下运行。
这个图形界面有点原始,不支持鼠标,所以不要用鼠标点。
二、图形界面下的程序调试
如果你更习惯于IDE的整体调试,也没有问题。很多支持Python的IDE,调试功能都十分强大,甚至轻量级编辑器也都具备完善的调试功能。接下来简单介绍几款图形化的IDE工具:
Visual Studio Code
VSC作为一个跨平台的重量级文本编辑器以及轻量级IDE,如今已经得到了越来越多开发者的喜爱,而Anaconda作为Python发行版集成环境,已将VSC作为推荐开发工具。
VSCode量级较轻,但只需要安装一个Python语言支持工具,摇身一变就能成为全功能Python IDE,智能感知、补全、重构、查找定义代码段等编辑功能一应俱全,而且调试功能也十分完整,能在调试模式中涵盖PDB的全部功能,并能在图形界面下简单地进行操作。
如果非要说一个VSCode的弱点的话,应该是其调试工具、解释器的配置没有具体的配置页面,需要通过配置文件来进行修改,这一点或许会给新手带来困惑。
Visual Studio
VS号称宇宙第一IDE,其Python开发工具自然也能带来非常好的体验。在VS2017中,Python开发环境就已经是可选择的安装选项了。对于许多曾经使用VS在Windows下进行其他语言开发工作的人而言,熟悉的快捷键、清晰的环境及不会特别夸张的资源消耗绝对是VS的加分点。
当然,其debugger功能也是一应俱全的。
Spyder
作为开源社区贡献的由Python编写的跨平台IDE,Spyder以轻量、便捷、高度集成为卖点。Spyder允许在多种不同的预设模式下工作,例如类似Matlab式的科学计算交互界面,以及其他应用工程开发形式的界面环境;在编码过程中Spyder可实时提示文档、交互式运行、调试时显示全部变量表,并可一键可视化等,对于数据分析而言具有很好的便利性;同样,它也支持步进跟踪等一系列PDB所提供的调试功能。若是说缺点,界面本身不具时尚感,算吧?
Eclipse + PyDev
Eclipse是最辉煌的开源跨平台多语言IDE之一,有着大量用户的簇拥,自然它也为Python提供了支持。PyDev是Eclipse上的Python开发工具包,提供完整IDE功能,也包含所述的断点、步进等调试功能,Eclipse + PyDev可能是最完整的开源Python IDE解决方案。
PyCharm
或许每一个Python开发者对于PyCharm都不陌生,作为目前最好用的Python IDE,PyCharm保持着一个季度一更新的版本迭代频率,每次更新都能带来功能上的惊喜,并且无论你是数据分析、应用开发者抑或是服务端开发,PyCharm都能提供最好的体验。它是最智能的IDE,能够通过你引用的模块推断提醒你是否需要进入科学计算模式;能够解析代码中存在的其它语言片段(如字符串中的SQL、HTML、JS等);可以结合Jupyter Notebook进行开发和展示;能够通过代码生成UML图,包含图形化的单元测试、覆盖率分析、性能分析工具和并行分析工具;能够远程调试、一键部署,能深入结合各种常见框架提供更好的支持;也能方便地进行图形化debug。
PyCharm的缺点?应该是在设置好解释器后,PyCharm将会对环境中所有的site-package进行解析和抽取,以供智能感知自动补全使用,在这期间IDE对内存和CPU的占用都非常大,但如若您的电脑用一块高速SSD作为硬盘,同时又有足够大的内存,一切便会显得非常完美。
与Visual Studio类似,PyCharm是商业软件,虽然它也提供了免费的社区版,但相比之下,社区版的PyCharm受限的功能较多。不过,如果你还是一名学生,便可以利用自己的教育邮箱申请免费的教育版学生授权,体验与Pro版一致的全部功能。
转载于:https://blog.51cto.com/14246112/2409701
相关文章:

selenium中javascript调试
之前写了使用js输入长文件的文章,有同事在使用时,发现竟然无法输入,也不知道是什么原因,且用的还是id方式。 在参考网文后,才发现是js写的有问题,现总结一下 javascript调试,在firefox中就自带有…
算法基础知识科普:8大搜索算法之AVL树(下)
昨天我们介绍了在进行结点插入时,若左子树深度超过右子树深度两层则进行右旋来保持平衡。今天继续介绍,若右子树深度超过左子树深度两层时的左旋操作,以及删除结点后平衡因子的变更问题。 这些都掌握后,基本上对AVL就有一个很全面…

《代码敲不队》第八次团队作业:Alpha冲刺 第二天
项目内容这个作业属于哪个课程任课教师博客主页链接这个作业的要求在哪里作业链接地址团队名称代码敲不队作业学习目标掌握软件编码实现的工程要求。团队项目github仓库地址链接 GitHub 第二天 日期:2019/6/16 今日完成任务情况以及遇到的问题 针对设计好的数据库&a…

我的.net程序为何不能执行?
今天早上习惯性的打开公司内部的网站。不料却发现我在输入地址后,系统竟会弹出一个对话框要求输入用户名和密码。想了想后,输入了AD的密码,就可以进入了网站。不经意间我又发现所有的asp.net的页面都不能打开,而asp的页面却一点问…

利用MySQL触发器实现check和assertion
MySQL虽然输入check语句不会报错,但是实际上并没有check的功能。但是MySQL 依然可以利用触发器来实现相应功能。 本文将根据两个例子简要阐述MySQL实现check和assertion的思路。 MySQL触发器 官方文档 MySQL Signal 官方文档 注意 signal异常处理功能在MySQL5.5版本…
算法基础知识科普:8大搜索算法之红黑树(上)
平衡二叉树(AVL)是一种特殊的二叉搜索树(BST),即每个结点的值都大于其左子树且小于其右子树的值(若存在),并通过引入平衡因子的概念来保持树的平衡。平衡二叉树算法的重点是在插入、…

Java Web学习总结(17)——JSP属性范围
2019独角兽企业重金招聘Python工程师标准>>> 所谓的属性范围就是一个属性设置之后,可以经过多少个其他页面后仍然可以访问的保存范围。 一、JSP属性范围 JSP中提供了四种属性范围,四种属性范围分别指以下四种: 当前页:…

为什么不提供离线Blog管理工具呢?
网络Blog现在是到处开花, 好像全世界的网民都开始写Blog了. 但因为Web的HTTP无状态协议, 网站本身都自己设置有session过期时间. 如果写的Blog文字多,时间一长用户登录状态就没了,当你提交你的文字时系统会出错,结果你回来时,你辛辛苦苦写的长长的文字都没了, 你是不是很气愤?…

javascript a 标签打开相对路径,绝对路径
<a>标签中的href中,如果你写一个路径默认是以相对路径打开的,加上"http://" 消息头那就可以打开绝对路径 html: <a hrefjavascript:void(0); target_blank onclickCommon.openUrl(" rowObject.baiduPanUrl ")…
算法基础知识科普:8大搜索算法之红黑树(中)
红黑树也是一种特殊形式的二叉搜索树,通过结点的颜色以及三条规则来保证二叉搜索树的平衡。规则1:根结点的颜色是黑色,规则2:叶子结点到根结点路径上遇到的黑色结点数目相同,规则3:叶子结点到根结点路径上无…

Java基础学习总结(3)——抽象类
2019独角兽企业重金招聘Python工程师标准>>> 一、抽象类介绍 下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public ab…

Knuth(佩服的一塌糊涂)
Donald Knuth自传的开头这样写道:“Donald Knuth真的只是一个人么?”(我觉得不是,^_^)作为世界顶级计算机科学家之一,Knuth教授已经完成了编译程序、属性文法和运算法则的前沿研究,并编著完成了已在程序设计领域中具有…
编程基础知识科普:C#中的问号运算符
C#是一门非常性感的语言,时不时冒出一些语法糖来满足大家的需求,问号运算符就是其中的一种。我们知道基础数据类型的默认值都是基础数据类型的,如int为0,double为0.0,bool为false等等,而引用类型的默认值为…
Listener监听器之HttpSessionListener
编写一个OnlineUserListener。 package anni; import java.util.List; import javax.servlet.ServletContext; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpSessionListener; import javax.servlet.http.HttpSessionEvent;public class OnlineUserL…

ActiveMQ快速入门
2019独角兽企业重金招聘Python工程师标准>>> 1.下载ActiveMQ 去官方网站下载:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.5.1-bin.zip,然后双击apache-activemq-5.5.1\bin\activemq.bat运行ActiveMQ程序。 启动Act…

企业为什么要使用基于Docker的PaaS/CaaS平台
作者:精灵云 前言早在十多年前国内外的一些大厂就开始投入研发和使用容器技术,比如Google,对他们来说,使用容器能够充分利用计算资源节省硬件成本。而这几年——众所周知——真正把容器技术发扬光大的是Docker。Docker的slogan“B…
算法基础知识科普:8大搜索算法之红黑树(下)
这是介绍红黑树的最后一部分,令y为要删除结点,n为要删除结点的子结点(子结点最多有1个),w为y的兄弟结点,删除操作的重点是使红黑树删除结点并通过调整后仍满足自身是搜索二叉树和设定的三点规则。删除操作可…

asp提供在线文章翻译的功能(转)
有时候想为我们的网页提供多语言支持,如果一种语言用一张网页来做实在太麻烦了,幸好Google提供了语言工具功能,下面介绍如何利用它来实现网页多种语言之间的转换。 作者:淘特网 出处:http://www.tot.name 注࿱…

Java基础学习总结(13)——流IO
2019独角兽企业重金招聘Python工程师标准>>> 一、JAVA流式输入/输出原理 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块空间,在这个文…

ASP.NET 2.0 绑定高级技巧
1.简单数据绑定定<!--ASP.NET 1.x data binding expression --><%# DataBinder.Eval(Container.DataItem, "Price") %><!--Equivalent ASP.NET 2.0 data binding expression --><%# Eval("Price") %><!--XML data binding --&g…

JSP中的EL表达式详细介绍
2019独角兽企业重金招聘Python工程师标准>>> 一、JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素。它们通常用于对象操作以及执行那些影响所生成内容的计算。JSP 2.0…
Software development Problem
筹划“软件开发过程”以及“面向对象分析与设计”这个话题已有很长时间。虽然大学毕业后在Rational公司学习过这方面的内容,这几年带着团队也一直践行里面的理念与方法,但总感觉自己理解的不透彻,不敢动笔。 10年过去了,总不能一…

Spring MVC常用注解说明
2019独角兽企业重金招聘Python工程师标准>>> 使用Spring MVC的注解及其用法和其它相关知识来实现控制器功能。02 之前在使用Struts2实现MVC的注解时,是借助struts2-convention这个插件,如今我们使用Spring自带的spring-webmvc组件来实现同…

代码规范性与品质问题~
2001年在delphibbs做“首届Delphi编程竞赛”活动(http://www.delphibbs.com/delphibbs/dispq.asp?lid650664)的时候,曾就代码的规范性与品质问题与大家进行过讨论,摘录一些言论如下:3. 我们公司…

FutureTask中Treiber堆的实现
2019独角兽企业重金招聘Python工程师标准>>> 在文章FutureTask源码分析中简单说明了FutureTask中使用Treiber堆栈来保存等待结果的线程,本文将详细分析其原理。 Treiber堆使用CAS操作来实现节点的入栈和出栈,由于CAS操作只是保证操作的原子性…
软件开发过程中遇到的问题
今天早晨去石家庄河北电力工程监理有限公司,回来后就在整理这篇图文,结果还是过了12:00。这是针对昨天图文“Software Development Problem”的翻译以及自己的一些理解,分享给大家。 其实,看看这些东西蛮好的,最起码能…

Java基础学习总结(9)——this关键字
2019独角兽企业重金招聘Python工程师标准>>> 一、this关键字 this是一个引用,它指向自身的这个对象。 看内存分析图: 假设我们在堆内存new了一个对象,在这个对象里面你想象着他有一个引用this,this指向这个对象自己&am…

转贴:雅虎公司C#笔试题,看看你能解答多少
这是刚在在网上看到了,觉得这些题目出得真不错,能考出一个程序员的基本功。所以先发在这里,做个备份,以后慢慢来做(偶好像只能免强及格哦,呵呵,关于网络的题目太多了,偶不太熟啊&…

亿级PV请求的三种负载均衡技术
在互联网不断渗透到生活中的今天,各种各样的网络服务存在在我们身边,他们的访问流量也是大得惊人。一个大型网站(百万PV以上)想要正常访问,单单靠一台服务器是不可能提供稳定服务的。这时候就需要用负载均衡技术将海量…
The Six Best Practices(1~3)
前几期的图文我们介绍了软件工程中常见的问题,分析了产生这些问题的根本原因,引出了软件工程中的六个最佳经验。今天我们具体介绍这些最佳经验的内容。