揭秘python的5种最佳调试方法_揭秘 IPython 的 5 种最佳调试方法-阿里云开发者社区...

云栖号:https://yqh.aliyun.com

第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

一个好的集成开发环境(IDE)附带的调试器是开发人员能够拥有的最强大的工具之一,但并不是每个人都在使用一个带有很棒代码调试器的集成发环境(IDE)。作为程序员,在调试 Python 代码时,你觉得最好用的调试器有哪些?如果没有的话,不妨试试使用 IPython 作为调试器吧。

以下为译文:

Tenderlove(Ruby和Rails的核心开发人员之一)写了一篇很棒的文章,叫做“I am a puts debuggerer”,当我还在玩Ruby的时候,我很喜欢这篇文章。这篇文章的重点是想告诉大家:在许多情况下,你不需要一个成熟的调试器。别误会我(或者Tenderlove)的意思,我认为,一个好的集成开发环境(IDE)附带的调试器是开发人员能够拥有的最强大的工具之一!它能让你可以很轻松地在代码中放置断点、在stack trace中移动、或者动态地检查和修改变量。它也使开发人员在大型代码库上工作更加轻松,并且可以帮助新手程序员加快新项目的进度。

然而,今天的人们仍然会使用print语句来调试他们的代码。我总是这样做,因为打印出一个变量既快又容易。“我要开始调试会话”这句话听起来很沉重,而“我认为这个变量有问题。我想打印出来看看!”就轻松多了。下面就是我们用5分钟就能写出的一个print语句的例子:

print(a_varible)

...

if foo:

print(">>>>>>>>>>>>>>Inside 3rd IF")

...

print(">>>>>>>>>>>>>>Inside 37th IF")

print(">>>>>>>>>> #@!?#!!!")

上面的代码看起来很熟悉吧?使用print语句进行代码调试是毫无问题的。很多时候,你要做的只是找出Bug。有时候,这也是你能运用的调试代码的唯一方法。因为在不影响用户使用的前提下,你很难将调试代码添加到生产环境代码中。然而,仅仅添加一些print语句,然后查看日志应该不会造成什么问题。

并不是每个人都在使用一个带有很棒代码调试器的集成发环境(IDE)。2019年Stack Overflow开发者调查报告显示:30.5%的开发人员使用Notepad++,25.4%的开发人员使用Vim,23.4%的开发者使用Sublime Text。这些都是文本编辑器!尽管我看到开发人员在使用Vim时比大多数使用PyCharm或VS Code的用户更有效率,但是要记住一个文本编辑器并不会带有强大的代码调试器。要调试Python代码,你当然可以使用标准的Python调试器pdb,但是现在你有一个更好的选择:那就是使用IPython作为调试器。

我使用VS Code已经快两年了,但我不记得上次使用其内置的调试器是什么时候。我大部分的调试工作都是在IPython中完成的。以下是我的调试方法:

将IPython会话嵌入到代码中

对我而言,最常用的做法是在代码中嵌入一个IPython会话。你只需要在代码中插入以下两行就可以做到:

from IPython import embed

embed()

我喜欢把这两行代码放在同一行,像下面这样:

from IPython import embed; embed()

这样的话,我只需要敲一次键盘就能把它移除掉。而且,在Python中,将多个语句放在同一行是一种坏习惯,因此所有的code linter都会将这行作为一个问题标注出来,这样的话,当调试完成后,调试就不会忘记把它移除😉。

当你运行代码并且解释器到达带有embed()函数的行时,它将打开一个IPython会话。你可以仔细查看代码中发生了什么。当你完成后,你只需要使用Ctrl+d关闭会话,代码将继续执行。这种方法的一个优点是,当你关闭IPython会话时,你在IPython中所做的所有修改都将保存下来。因此,你可以用这种方式对变量或函数进行修改(甚至可以用一些简单的日志来修饰函数),并查看其余代码的行为。

下面是使用embed()的简短演示。假设我们有以下代码:

a = 10

b = 15

from IPython import embed; embed()

print(f"a+b = {a+b}")

下面是我们运行它时发生的情况:

如上所见,我更改了a变量的值,当我关闭IPython会话后,a的新值保留下来了。

在代码中放置断点

如果你想查看在给定代码行上发生的情况,在代码中嵌入一个IPython会话是不错的做法。但是它不能像真正的调试器那样,让你可以执行下一行代码。所以更好的办法是在代码中放置一个断点。从Python 版本3.7开始,有一个新的名为breakpoint()的内置函数可以用来放置断点。如果你使用的是较低版本的Python,你可以通过运行以下代码来实现同样的效果:

import pdb; pdb.set_trace()

Python的默认调试器(pdb)相当初级。就像在标准Python REPL(—种交互式解释器环境。R-read)、E-evaluate)、P-print)、L-loop)中一样,它没有语法突出显示或自动缩进的功能。一个更好的选择是ipdb。它将使用IPython作为调试器。要启用它,需要将上面代码中的pdb替换成ipdb:

import ipdb; ipdb.set_trace()

还有另一个有趣的调试器PDB++。它有一组不同于ipdb的特性,例如,一个不断显示代码当前位置的粘滞模式。

不管你最终使用哪个调试器,它们都有一组相当标准的命令。你可以通过调用next命令(或者只是n命令)来执行下一行,通过调用step(或s)命令进入函数内部,使用continue(或c)命令继续执行直至下一个断点,使用l或ll命令显示当前代码执行的位置,等等。如果你是一个CLI(命令行接口)类型调试器的新手,那么“使用Pdb调试Python代码教程”应该对你掌握它们会有帮助。

%run -d filename.py

IPython还有另外一种方式启动一个调试器。你不需要像前面那样修改任何文件的源代码。你只需要运行%run -d filename.py这个神奇的命令,然后IPython将执行filename.py文件并在其第一行设置一个断点。作用等同于将import ipdb; ipdb.set_trace()手动放入filename.py文件中,并且使用python filename.py命令来运行它一样。

如果要将断点放在第一行之外的其他位置,可以使用-b参数。以下代码将断点放置在第42行的位置:

%run -d -b42 filename.py

记住,这里指定的行必须包含实际执行某些操作的代码。不能是空行或注释行!

最后,可能存在这样一种情形:你希望将断点放在一个不是你将要运行的文件中。比如说,某个bug可能隐藏在一个导入的模块中,而你不想再键入100次next命令就可以执行到那里。-b参数可以接受一个文件名,后跟一个冒号和一个行号,以指定要将断点确切放置到的位置,修改后的代码如下:

%run -d -b myotherfile.py:42 myscript.py

上面的代码将在名为myotherfile.py的文件的第42行设置一个断点,然后开始执行myotherfile.py文件。一旦Python解释器到达myotherfile.py,它将在断点处停止。

事后调试(Post-mortem debugging)

IPython共有176项特性。事后调试是最好的特性,至少对我来说是这样。假设你正在运行一个长期运行的脚本,在运行了15分钟后,它突然崩溃了。那么,你能做的是设置一些断点,重新运行它,然后再等待15分钟,看看发生了什么吗?如果你用的是IPython,只要调用一个神奇的命令%debug,你就不必等待了。%debug将加载最后一个异常发生时的stack trace,并且启动调试器(Python将最后一个未处理的异常存储在sys.last_traceback变量中)。这是一个很好的特性,它可以让你直接启动调试器,节省了几个小时的重新运行一些命令的时间。

如果使用的是标准pdb调试器,则可以通过运行import pdb; pdb.pm()命令来实现相同的效果。

使用%pdb自动启动调试器

让调试更加方便的唯一方法是在发生异常时自动启动调试器。IPython中的这个神奇的命令 - %pdb就能实现这一点。

如果运行%pdb 1(或%pdb on)命令,调试器将在每个未处理的异常上自动启动。你可以使用%pdb 0或关闭%pdb on命令关闭这个功能。不带任何参数运行地运行%pdb将在打开和关闭自动调试器之间进行切换。

云栖号:https://yqh.aliyun.com

第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

原文发布时间:2020-1-18

本文作者:switowski

本文来自阿里云云栖号合作伙伴“CSDN”,了解相关信息可以关注“CSDN”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是云原生?

> 一千个读者眼里有一千个哈姆雷特,本号近半年零零散散写了一些云原生、Devops的文章, 最近系统阅读微软Docs, 今天开始结合自己的实践专题意译[云原生]。近几年,云原生成为了软件行业的驱动力。这是一种构建大型复杂系统的新…

VForum 2008系列之六:分论坛视频-虚拟世界中的应用

VMware vForum 2008中国虚拟化用户大会与2008年11月4日在北京的国际饭店举行。这是第五论坛的主题介绍:虚拟世界的应用,由VMware资深渠道工程师郭岚演讲。随后是合作伙伴关于该主题的介绍。

linux服务器查配置信息失败,查看Linux服务器的配置信息

一、目标查看服务器的相关配置,例如服务器的品牌,CPU,内存,磁盘等等信息二、环境1.浪潮物理机2.系统centos三、相关查询1. 查看操作系统的版本命令:cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core)2.查看系统内核命…

宇宙十大不为人知的事情

仰望星空,才知人类如何渺小可怜,还需要继续思考很多年才知道,科学的尽头是神学。宇宙有你想象的到的所有东西,还有你想象不道的更多东西,就比如以下的宇宙十大真相。 一、宇宙空洞 除了黑洞,宇宙中另一种结…

idea shell 中的函数 跳转_SpringBoot项目打包+shell脚本部署实践,太有用了

本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作;profiles指定不同环境的配置maven-assembly-plugin打发布压缩包分享shenniu_publish.sh程序启动工具linux上使用shenniu_publish.…

阅读源码的真正价值

大家好,我是Z哥。最近有位小伙伴求职遇到一些挫折,来找到我聊,其中有问到一个涉及到「阅读源码的必要性」的问题:“有很多场面试,面试官都有问到某个框架的某个功能是怎么实现的,难道真的要去看源码吗&…

c#中BackGroundWorker控件

一、BackGroundWorker工作步骤 1.向窗体中拖入一个BackGroundWorker控件。 2.在某个方法或者事件中,调用BackGroundWorker的RunWorkerAsync()方法。 3.该方法为异步操作,将自动引发BackGroundWorker的DoWork事件。 4.调用ReportProgress方法将引发Progre…

vst3插件_Steinberg发布新的VST 3.7 SDK,音乐软件开发者速来围观

Steinberg日前宣布最新的VST SDK(软件开发工具包)即将面市。最新的VST 3.7引入了多项SDK接口增强功能,使VST3宿主和插件之间的集成达到了新的水平,还包括新的VST3项目生成器、改进的文档以及对MIDI 2.0的支持,还可以开…

linux脚本启三个tomcat,linux 重写Tomcat启停脚本

#!/bin/bash## description: Tomcat start/stop/status script#Location of JAVA_HOMEexport JAVA_HOME/opt/extp/tpc/jdk1.7 # 根据情况更改自己的jdk地址#Add Java binary files to PATHexport PATH$JAVA_HOME/bin:$PATH#CATALINA_HOME is the location of the configuration…

GitHub 2017 年度报告,最受欢迎的编程语言是?

GitHub 每年都会在年度盛会中推出数据报告,其中列出了一些年度的数据,包括其网站中最受欢迎的编程语言、开源项目等。今年的数据更是让人眼前一亮,Python 这匹编程语言中的黑马,势不可挡! 编程语言之间的战争就是一场持…

python except用法和作用_121个问题答对80%那么恭喜你,Python的高薪工作迟早有你一份...

1. Python和Java、PHP、C、C#、C等其他语言的对比?2. 简述解释型和编译型编程语言?3. 代码中要修改不可变数据会出现什么问题? 抛出什么异4. print 调用 Python 中底层的什么方法?5. 简述你对 input()函数的理解?6. Python解释器种类以及特点&#xf…

相对论基础的谬误

《广义时空论•像说》附录之五      相对论是相对正确的,因为这个世界能最快描绘一个物体表征的手段是光,即光是标尺。  当物体速度小于光速时,通过对物体发出来的光的探测,可以得出物体的速度表征,及物体的一…

word2vec原理_word2vec论文阅读笔记

word2vec算是NLP中的经典算法,之前在课程中简单的学过,但面试时经不起深问。痛定思痛,参考Jack(没搜出来)的总结,笔者重点阅读了Mikolov的原始论文[1]和Xin Rong的详细推导[2]。Jack:word2vec 相…

GraphQL:来来来,Union

Union就是把不相干的一些数据实体,合并起来,一起供外部查询。不用像webapi,完成查询不同的数据,需要多次请求。一次请求,获取多样数据,减少请求次数,这也是GraphQL的优势之一。怎么弄&#xff0…

每个程序员都应该知道的基础数论

这篇文章讨论了数论中每个程序员都应该知道的几个重要概念。本文的内容既不是对数论的入门介绍,也不是针对数论中任何特定算法的讨论,而只是想要做为数论的一篇参考。如果读者想要获取关于数论的更多细节,文中也提供了一些外部的参考文献&…

powerbi视觉对象_玩转Power BI的图片可视化

​制作可视化报告时,为了展示效果,有时候需要用图片来展示,在 Power BI 中,关于图片的自定义视觉对象主要有下面三个,利用他们可以很轻松的进行图片可视化。下面来看看这些视觉对象的效果。样本数据如下:为…

.gpg 进程 linux,小知识之Linux系统中的最大进程数,最大文件描述,最大线程数...

今天来了解一下linux里面的一些小知识:(一)Linux系统中最大可以起多少个进程?(1)32位系统中最多可以起32768个进程(2)64位系统中最多可以起2的22次方(4194304)约420万个如何查看linux系统默认的最大进程数,这里以centos7(x64)作为例子:[roote…

东南大学计算机网络_东南大学,2020年东南大学高考录取分数线分析

各位读者大家好,今天给大家介绍的是南京重点大学—东南大学。小编一直从事高等教育领域的写作,感兴趣的读者可以关注一下小编~1.学校基础东南大学,简称“东大”,是中华人民共和国教育部直属、中央直管副部级建制的全国重点大学&am…

Goodbye 2020,Welcome 2021 | 沉淀 2021

引言2021年,已开启二月的篇章,农历新年也张灯结彩而来,只不过要留守过年。在这辞旧迎新之际,踏入而立之年之时,正是算账的好时候,数一数今年的成长,讲一讲来年的期望,最重要的还是要…

试着翻译24小时自学SQL第四版

最近发现自己在SQL方面的功课学的很不到家,就饿补下了,就上网找了这本 Sams Teach Yourself SQL in 24Hours 这本书,感觉还是不错的而且都到第四版了,翻译了下目录感觉还是很值得学习的,悔不该在大三的时候没有好好的学好数据库啊,现在出来工作了感觉这方面是所有程序的基础,作…