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

Python 调试器

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

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

运行 pdb

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

# pdb_test.py
#!/usr/bin/python3from time import sleepdef countdown(number):
for i in range(number, 0, -1):
print(i)
sleep(1)if __name__ == "__main__":
seconds = 10
countdown(seconds)

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

$ python3 -m pdb pdb_test.py
> /tmp/pdb_test.py(1)<module>()
-> from time import sleep
(Pdb)

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

# pdb_test.py
#!/usr/bin/python3from time import sleepdef countdown(number):
for i in range(number, 0, -1):
import pdb; pdb.set_trace()
print(i)
sleep(1)if __name__ == "__main__":
seconds = 10
countdown(seconds)
$ python3 pdb_test.py
> /tmp/pdb_test.py(6)countdown()
-> print(i)
(Pdb)

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

穿行于执行堆栈

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

  • w(here):显示当前执行的行以及执行堆栈的位置。

    $ python3 test_pdb.py
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) w
    /tmp/test_pdb.py(16)<module>()
    -> countdown(seconds)
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb)
  • l(ist):显示当前位置周围更多的上下文(代码)。

    $ python3 test_pdb.py
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) l
    5
    6
    7 def countdown(number):
    8 for i in range(number, 0, -1):
    9 import pdb; pdb.set_trace()
    10 -> print(i)
    11 sleep(1)
    12
    13
    14 if __name__ == "__main__":
    15 seconds = 10
  • u(p)/d(own):向上或向下穿行调用堆栈。

    $ py3 test_pdb.py
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) up
    > /tmp/test_pdb.py(16)<module>()
    -> countdown(seconds)
    (Pdb) down
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb)

单步执行程序

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

  • n(ext):继续执行,直到达到当前函数中的下一行,或者返回
  • s(tep):执行当前行并在第一个可能的场合停止(在被调用的函数或当前函数中)
  • c(ontinue):继续执行,仅在断点处停止。

    $ py3 test_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()
    -> for i in range(number, 0, -1):
    (Pdb) n
    > /tmp/test_pdb.py(9)countdown()
    -> import pdb; pdb.set_trace()
    (Pdb) s
    --Call--
    > /usr/lib64/python3.6/pdb.py(1584)set_trace()
    -> def set_trace():
    (Pdb) c
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) c
    9
    > /tmp/test_pdb.py(9)countdown()
    -> import pdb; pdb.set_trace()
    (Pdb)

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

检查变量内容

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

    py3 test_pdb.py
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) where
    /tmp/test_pdb.py(16)<module>()
    -> countdown(seconds)
    > /tmp/test_pdb.py(10)countdown()
    -> print(i)
    (Pdb) args
    number = 10
    (Pdb)

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

  • 可用于打印变量值的另一个命令是 p(rint)

     

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

$ py3 test_pdb.py
> /tmp/test_pdb.py(10)countdown()
-> print(i)
(Pdb) list
5
6
7 def countdown(number):
8 for i in range(number, 0, -1):
9 import pdb; pdb.set_trace()
10 -> print(i)
11 sleep(1)
12
13
14 if __name__ == "__main__":
15 seconds = 10
(Pdb) print(seconds)
10
(Pdb) p i
10
(Pdb) p number - i
0
(Pdb)

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

增强的调试器

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

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

安装 IPython 的 ipdb

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

$ python3 -m venv .test_pdb
$ source .test_pdb/bin/activate
(test_pdb)$ pip install ipdb

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

import ipdb; ipdb.set_trace()

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

$ sudo dnf install python3-ipdb

安装 pdb++

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

$ python3 -m venv .test_pdb
$ source .test_pdb/bin/activate
(test_pdb)$ pip install pdbp

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

import pdb; pdb.set_trace()

总结

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

via: https://fedoramagazine.org/getting-started-python-debugger/

更多Python视频、源码、资料加群683380553免费获取

作者:Clément Verna 选题:lujun9972 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Python 调试器入门相关推荐

  1. python调试器入门教程_PyCharm入门第一步(二)——调试第一个Python应用|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 第2步:调试您的第一个Python应用程序 找出问题的根源 PyCharm报告运行时错误:a ZeroDi ...

  2. 如何一起破解图形化Python调试器

    15分钟内从零调试 (Zero-to-Debugging in 15 mins) You don't realize the value of a debugger until you're stuc ...

  3. python的调试器_玩转Python调试器

    如果你还只会使用print来定位python程序问题,那这篇文章就是为你写的,这篇文章将带你入门python调试器.python标准库提供了一个叫pdb的调试器,它提供了调试所需的绝大多数常用功能,比 ...

  4. 优秀开发者必备技能包:Python调试器

    作者 | Roky0429 来源  | Python空间(ID:Devtogether) 人工智能的现状及今后发展趋势如何?  https://edu.csdn.net/topic/ai30?utm_ ...

  5. python调试器的功能,python调试器是什么

    1.说明 Python调试器,是可以节省时间并提高 Python 技能的工具,有标准库自带的pdb和开源的ipdb两种. 2.两种类型 pdb是Python自带的库,为Python提供了一种交互式的源 ...

  6. python断点调试_「Python调试器」,快速定位各种疑难杂症!!!

    在很多的编辑器其实都带着「调试程序」的功能,比如写 c/c++ 的 codeblocks,写 Python 的 pycharm,这种图形界面的使用和显示都相当友好,简单方便易学,这个不是我这篇文章要讲 ...

  7. Python 调试器 - ipdb

    ⚠️注意:PyTorch 代码中使用 ipdb 调试方式,不支持多线程.如果有多个 worker,将 worker 设置为 0 即可. ipdb 介绍 说明文档:ipdb ipdb 调试器具有语法高亮 ...

  8. pdb—Python调试器

    pdb-Python调试器 在python 3.8文档 Python 常用指引中已经详细介绍了pdb模块,此处为引用官方文档 该模块pdb为Python程序定义了一个交互式源代码调试器.它支持在源代码 ...

  9. 【Python基础】Python调试器pdb

    Python调试器pdb 1. pdb简介 2. pdb调试 2.1 pdb常用命令 2.2 pdb实例 更新历史: 2022年12月6日完成初稿 最近在写项目代码,其中需要在Vscode上写pyth ...

最新文章

  1. 计算机编程书籍-Python硬件开发树莓派从入门到实践无人驾驶 AndroidTV 自动循迹
  2. publiccms实现遍历多级分类下的不同样式内容
  3. 计算机网络7种类型,OSPF中7种类型LSA
  4. python中heading_python基础===trheading 模块
  5. FFmpeg学习(1)——视频文件格式转换
  6. Android实现友盟分享小程序
  7. 工行U盾出现“没有检测到卡片/PKCS11初始化失败”错误的原因和解决办法
  8. 基于双边滤波的图像增强算法
  9. Python-Seleium模拟登陆163邮箱
  10. 阿里云免费服务器测试题答案
  11. 介绍一下openkylin(开放麒麟),优麒麟和统信UOS
  12. MacOS连接VPN 提醒 “IPSec共享密钥”丢失。请验证您的设置并尝试重新连接。
  13. 什么是路由器 它的工作原理是什么
  14. Eclipse 使用中一些好用的快捷键
  15. 第一章:第一节数据载入及初步观察-课程
  16. 电驴服务器搜索文件排序,【图文教程】搜索功能使用全解
  17. DWZ (JUI) 教程 修正 Tab 选项卡多次加载
  18. 《人工智能》之《机器学习》
  19. 成都微信小程序电商定制报价
  20. 基于 Django 3.2 VUE nginx 框架开发 机器学习在线 系统

热门文章

  1. 计算机科学家沃斯提出的公式,第一章C语言的概述
  2. 金融助贷通过运营商大数据获客 流量不断 高精准用户直达
  3. ArrayDeque类的使用
  4. Pwnable.tw之BookWriter
  5. java后端 防重复提交_后台防止表单重复提交
  6. SQL中add添加列语句
  7. Mysql还原数据库
  8. ADIDAS鞋标之终极诠释--基本知识,真假辨别(超多图),鞋标发展史!
  9. 简单几步解决IE11无法显示此页的问题
  10. 什么是页缓存(Page Cache)(转载)