Python 调试器入门

关键时刻,第一时间送达!

先不说楚枫的这般年纪,能够踏入元武一重说明了什么,最主要的是,楚枫在刚刚踏入核心地带时,明明只是灵武七重,而在这两个月不到的时间,连跳两重修为,又跳过一个大境界,踏入了元武一重,这般进步速度,简直堪称变态啊。

“这楚枫不简单,原来是一位天才,若是让他继续成长下去,绝对能成为一号人物,不过可惜,他太狂妄了,竟与龚师兄定下生死约战,一年时间,他再厉害也无法战胜龚师兄。”有人认识到楚枫的潜力后,为楚枫感到惋惜。

“哼,何须一年,此子今日就必败,巫九与龚师兄关系甚好,早就看他不顺眼了,如今他竟敢登上生死台挑战巫九,巫九岂会放过他?”但也有人认为,楚枫今日就已是在劫难逃。

“何人挑战老子?”就在这时,又是一声爆喝响起,而后一道身影自人群之中掠出,最后稳稳的落在了比斗台上。

这位身材瘦弱,身高平平,长得那叫一个猥琐,金钩鼻子蛤蟆眼,嘴巴一张牙带色儿,说话臭气能传三十米,他若是当面对谁哈口气,都能让那人跪在地上狂呕不止。

不过别看这位长得不咋地,他在核心地带可是鼎鼎有名,剑道盟创建者,青龙榜第九名,正是巫九是也。

“你就是巫九?”楚枫眼前一亮,第一次发现,世间还有长得如此奇葩的人。

巫九鼻孔一张,大嘴一咧,拍着那干瘪的肚子,得意洋洋的道:“老子就是巫九,你挑战老子?”

“不是挑战你,是要宰了你。”楚枫冷声笑道。

“好,老子满足你这个心愿,长老,拿张生死状来,老子今日在这里了解了这小子。”巫九扯开嗓子,对着下方吼了一声。

如果他对内门长老这么说话,也就算了,但是敢这么跟核心长老说话的,他可真是算作胆肥的,就连许多核心弟子,都是倒吸了一口凉气,心想这楚枫够狂,想不到这巫九更狂。

不过最让人无言的就是,巫九话音落下不久,真有一位核心长老自人群走出,缓缓得来到了比斗台上,左手端着笔墨,右手拿着生死状,来到了巫九的身前。

“我去,这巫九什么身份,竟能这般使唤核心长老?”有人吃惊不已,那长老修为不低,乃是元武七重,比巫九还要高两个层次,但却这般听巫九的话,着实让人吃惊不已。

“这你就不知道了吧,巫九在前些时日,拜了钟离长老为师尊,已正式得到钟离长老的亲传。”有人解释道。

“钟离长老?可是那位性情古怪的钟离一护?”

“没错,就是他。”

“天哪,巫九竟然拜入了他的门下?”

人们再次大吃一惊,那钟离一护在青龙宗可是赫赫有名,若要是论其个人实力,在青龙宗内绝对能够排入前三,连护宗六老单打独斗都不会是他的对手。

只不过那钟离一护,如同诸葛青云一样,也是一位客卿长老,所以在青龙宗内只是挂个头衔,什么事都不管,更别说传授宗内弟子技艺了,如今巫九竟然能拜入他老人家门下,着实让人羡慕不已。

“恩怨生死台,的确可以决斗生死,但必须要有所恩怨,你们两个人,可有恩怨?”那位长老开口询问道。

编译:linux中国-Flowsnow ,英文:Clément Verna

https://linux.cn/article-9979-1.html

python开发整理发布,转载请联系作者获得授权

Python 生态系统包含丰富的工具和库,可以让开发人员更加舒适。 例如,我们之前已经介绍了如何使用交互式 shell 增强 Python。本文重点介绍另一种可以节省时间并提高 Python 技能的工具:Python 调试器。

Python 调试器

Python 标准库提供了一个名为 pdb 的调试器。此调试器提供了调试所需的大多数功能,如断点、单行步进、堆栈帧的检查等等。

了解一些pdb 的基本知识很有用,因为它是标准库的一部分。 你可以在无法安装其他增强的调试器的环境中使用它。

运行 pdb

运行 pdb 的最简单方法是从命令行,将程序作为参数传递来调试。 看看以下脚本:

# pdb_test.py

#!/usr/bin/python3

fromtimeimportsleep

defcountdown(number):

foriinrange(number,,-1):

print(i)

sleep(1)

if__name__=="__main__":

seconds=10

countdown(seconds)

你可以从命令行运行 pdb,如下所示:

$python3-mpdbpdb_test.py

> /tmp/pdb_test.py(1)()

->fromtimeimportsleep

(Pdb)

使用 pdb 的另一种方法是在程序中设置断点。为此,请导入模块并使用函数:

# pdb_test.py

#!/usr/bin/python3

fromtimeimportsleep

defcountdown(number):

foriinrange(number,,-1):

importpdb;pdb.set_trace()

print(i)

sleep(1)

if__name__=="__main__":

seconds=10

countdown(seconds)

$python3pdb_test.py

> /tmp/pdb_test.py(6)countdown()

->print(i)

(Pdb)

脚本在断点处停止,pdb 显示脚本中的下一行。 你也可以在失败后执行调试器。 这称为事后调试postmortem debugging。

穿行于执行堆栈

调试中的一个常见用例是在执行堆栈中穿行。 Python 调试器运行后,可以使用以下命令:

:显示当前执行的行以及执行堆栈的位置。

$python3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)w

/tmp/test_pdb.py(16)()

->countdown(seconds)

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)

:显示当前位置周围更多的上下文(代码)

$python3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)l

5

6

7defcountdown(number):

8foriinrange(number,,-1):

9importpdb;pdb.set_trace()

10->print(i)

11sleep(1)

12

13

14if__name__=="__main__":

15seconds=10

/:向上或向下穿行调用堆栈。

$py3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)up

> /tmp/test_pdb.py(16)()

->countdown(seconds)

(Pdb)down

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)

单步执行程序

pdb提供以下命令来执行和单步执行代码:

:继续执行,直到达到当前函数中的下一行,或者返回

:执行当前行并在第一个可能的场合停止(在被调用的函数或当前函数中)

:继续执行,仅在断点处停止。

$py3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)n

10

> /tmp/test_pdb.py(11)countdown()

->sleep(1)

(Pdb)n

> /tmp/test_pdb.py(8)countdown()

->foriinrange(number,,-1):

(Pdb)n

> /tmp/test_pdb.py(9)countdown()

->importpdb;pdb.set_trace()

(Pdb)s

--Call--

> /usr/lib64/python3.6/pdb.py(1584)set_trace()

->defset_trace():

(Pdb)c

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)c

9

> /tmp/test_pdb.py(9)countdown()

->importpdb;pdb.set_trace()

(Pdb)

该示例显示了 和 之间的区别。 实际上,当使用 时,调试器会进入 模块源代码,而接下来就会执行 函数。

检查变量内容

pdb 非常有用的地方是检查执行堆栈中存储的变量的内容。 例如,命令打印当前函数的变量,如下所示:

py3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)where

/tmp/test_pdb.py(16)()

->countdown(seconds)

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)args

number=10

(Pdb)

pdb 打印变量的值,在本例中是 10。

可用于打印变量值的另一个命令是。

$py3test_pdb.py

> /tmp/test_pdb.py(10)countdown()

->print(i)

(Pdb)list

5

6

7defcountdown(number):

8foriinrange(number,,-1):

9importpdb;pdb.set_trace()

10->print(i)

11sleep(1)

12

13

14if__name__=="__main__":

15seconds=10

(Pdb)print(seconds)

10

(Pdb)pi

10

(Pdb)pnumber-i

(Pdb)

如示例中最后的命令所示, 可以在显示结果之前计算表达式。

Python 文档包含每个 pdb 命令的参考和示例。 对于开始使用 Python 调试器人来说,这是一个有用的读物。

增强的调试器

一些增强的调试器提供了更好的用户体验。 大多数为 pdb 添加了有用的额外功能,例如语法突出高亮、更好的回溯和自省。 流行的增强调试器包括 IPython 的 ipdb 和 pdb++。

这些示例显示如何在虚拟环境中安装这两个调试器。 这些示例使用新的虚拟环境,但在调试应用程序的情况下,应使用应用程序的虚拟环境。

安装 IPython 的 ipdb

要安装 IPython ipdb,请在虚拟环境中使用 :

$python3-mvenv.test_pdb

$source.test_pdb/bin/activate

(test_pdb)$pip installipdb

要在脚本中调用 ipdb,必须使用以下命令。 请注意,该模块称为 ipdb 而不是 pdb:

importipdb;ipdb.set_trace()

IPython 的 ipdb 也可以用 Fedora 包安装,所以你可以使用 Fedora 的包管理器来安装它:

$sudo dnf installpython3-ipdb

安装 pdb++

你可以类似地安装 pdb++:

$python3-mvenv.test_pdb

$source.test_pdb/bin/activate

(test_pdb)$pip installpdbp

pdb++ 重写了 pdb 模块,因此你可以使用相同的语法在程序中添加断点:

importpdb;pdb.set_trace()

总结

学习如何使用 Python 调试器可以节省你在排查应用程序问题时的时间。 对于了解应用程序或某些库的复杂部分如何工作也是有用的,从而提高 Python 开发人员的技能。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180908B1D2K200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券