掌握 Python 调试技巧:强大工具助你一臂之力
想成为真正的 Python 调试专家吗? 别再犹豫了! 我们将为你介绍一系列令人惊叹的 Python 调试工具和库,它们将使你的代码调试过程事半功倍。
Python 作为一种通用、高级且面向对象的编程语言,被广泛应用于各种开发领域。 从 Web 应用程序开发到数据抓取,再到更复杂的应用,如机器学习和数据科学,Python 都是一种高效的开发工具。
在开发过程中,难免会出现被称为编程错误的 “bug”。 为了检测和消除代码中存在的或潜在的错误,开发人员通常会采取一系列步骤。 这样做可以防止程序代码崩溃,而这个过程就是我们所说的调试。
本文将为你介绍几种常用的 Python 调试器,并分析它们之间的差异,以及各自的优势。
cProfiler 调试库
cProfiler
是一个流行的库,也是一个 C 扩展,专用于分析长时间运行的代码。 它可以识别程序代码中运行时间较长的部分。 虽然它能精确地确定代码不同部分的运行时间,但它不能直接识别或修复代码中的错误。
因此,我们需要使用其他调试器。
幸运的是,还有很多其他的库可以帮助你调试 Python 代码,例如 ipdb、Django-debug-toolbar、pyelftools、viztracer 和 py-spy。
ipdb 调试工具
完全启用 IPython 的 Python 调试器 ipdb 是一个交互式的第三方调试器,它继承了
pdb
的功能。
ipbd
还支持交互式 shell IPython,包括制表符补全、颜色支持和魔法功能等。
该调试器通过导出相关函数,启用对 IPython 调试器的访问。 它还提供了一个类似于 pdb 模块的接口,以更好地进行自省。
使用 Ipdb 进行调试
使用 pip 命令安装该库:
pip install ipdb
以下是一个使用 ipdb 的示例:
import ipdb alpha_list = ['a', 'b', 'c'] fruit_list = ['orange', 'mango', 'kiwi'] def nested_loop(): for fruit in fruit_list: print (fruit) ipdb.set_trace() for x in alpha_list: print(x) if __name__ == '__main__': nested_loop()
使用以下命令运行 Python 文件,其中 test.py 是文件名:
python -m ipdb test.py
导入 ipdb 并运行
ipdb.set_trace()
函数后,程序将开始执行,并启动调试器。
ipdb.pm()
函数 (事后分析) 的作用类似于
%debug
魔法函数。
set_trace 参数
将上下文作为参数传递给
set_trace
可以显示定义的几行代码。 此外,
set_trace
还接受一个名为
cond
的布尔值参数。 当你将
cond
设置为 true 时,它将启动 ipdb 接口。
使用配置文件
你可以使用主文件夹或项目文件夹中的
idpdb
文件或
setup.cfg
文件来设置上下文参数。 你可以进一步探索 ipdb 的更多功能。
Django 调试工具栏
Django 调试工具栏
是 Django (一个 Python 框架) 中非常流行的调试工具。
这组可配置的面板可以显示当前请求或响应的调试信息。 点击工具栏时,会显示有关面板内容的更多详细信息。
此工具可以彻底检查 Django 开发环境。
请按照
此处的
安装过程和配置说明进行操作。
Pyelftools 库
pyelftools
库完全基于 Python 构建。 它解析和分析 ELF 文件和 DWARF 调试信息,而且只需要 Python 即可运行。
pyelftools 的使用非常方便,因为它没有任何外部依赖项。 此外,无需安装即可使用 pyelftools,只需在环境变量中调整 PYTHONPATH。
你可以使用以下命令安装它:
pip install pyelftools
要使用 pyelftools,只需导入它并在你的程序中调用即可。
冰淇淋🍦调试工具
这是 Python 开发人员的另一个高效调试工具。
使用
冰淇淋
,也称
ic()
,有很多优于
print()
的优点,如下所述:
- 它打字相对较快。
- 它可以很好地打印数据结构。
- 使用
ic()
可以打印表达式或变量名称及其值。 - 它会突出显示输出的语法。
- 可选地,它可以包含程序上下文,例如文件名、行号和父函数。
在使用该软件包之前,请使用以下 pip 命令进行安装:
pip install icecream
好消息是,你可以在所有文件中使用
ic()
,而无需使用
install()
将其导入每个文件。 此外,
install()
会将
ic()
添加到内置模块中。 解释器导入的所有文件都将共享
ic()
。
在你可以命名为
x.py
的根 Python 文件中,使用
install()
添加
ic()
。
from icecream import install install() from y import mult mult()
在 y.py
文件中导入 x.py
文件并调用 ic()
:
def mult(): z=8 ic(z)
结果:
y ic| z : 8
ic()
之所以更高效,是因为它可以检查传递给它的变量,包括它自己,然后打印出其参数和参数值,如下例所示。
from icecream import ic def mult(x): return x * 4 ic(mult(100))
输出:
ic| mult(100): 400
此外,你可以将
ic()
插入到现有的代码中,因为它会返回其参数。 例如,以下代码将首先返回
ic| x: 12
,然后返回
ic| y: 48
。
from icecream import ic x = 12 def mult(x): return x*4 y = mult(ic(x)) ic(y)
使用 py-spy 工具进行调试
你可以使用
py-spy
来对 Python 程序的示例进行分析,作为一种调试工具。 py-spy 可以可视化 Python 程序的执行,而无需重新启动程序或修改其代码。 此外,由于它是用 Rust 编写的,因此开销非常低。
值得一提的是,在生产 Python 代码中使用 py-spy 是安全的,因为它运行的进程与被分析的 Python 程序不同。
和之前介绍的其他工具一样,你可以在安装后使用 py-spy 工具。
pip install py-spy
即使你的 Python 程序正在处理生产流量,你仍然可以使用 py-spy 来分析和调试该程序,这使其成为一款至关重要的 Python 分析工具。
Viztracer 调试器
或者,你可以使用调试工具 viztracer 来跟踪和可视化 Python 程序的执行。 这也是一个开销较低的日志分析工具。
是什么使得
viztracer
成为一种有效的调试工具?
- 它易于使用,并且不依赖于外部包。
- Viztracer 可以在所有操作系统平台上运行:Windows、Linux 或 macOS。
- 其强大的前端可以平滑地渲染 GB 级的跟踪数据。
-
它使用 RegEx 来记录任意函数和额外信息,例如
变量和属性
、
引发的异常
、
垃圾收集器操作
等,而无需修改源代码的任何部分。 - viztracer 之所以成为低开销的调试工具,是因为它可以过滤掉程序中不需要的数据。 然后,它会保留旧信息,并以 JSON 格式转储日志。
-
你可以使用它来插入自定义事件,例如
即时事件
、
可变事件
和
持续时间事件
,随着程序的运行。 这样,它的工作方式类似于打印调试,只是 viztracer 会在跟踪数据时告诉你打印发生的时间。
总结
Python 分析和调试,就像软件分析一样,是开发过程中需要关注的关键步骤。 这一步有助于排除任何有错误的程序代码段,从而优化代码的整体性能。
我们上面介绍的调试工具都是高效的工具,可以大大简化 Python 开发人员的工作。
考虑到其他调试工具比 cProfiler 更有效,你可以像真正的英雄一样调试 Python 代码,并使用这些调试器修复任何潜在的错误,从而确保代码运行顺畅,不会崩溃。
祝你调试愉快!