使用这些库和工具像英雄一样调试 Python

掌握 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 代码,并使用这些调试器修复任何潜在的错误,从而确保代码运行顺畅,不会崩溃。

祝你调试愉快!