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

已发表: 2022-06-26

你想成为真正的 Python 调试专家吗? 使用我们将很快介绍的这些令人惊叹的 Python 调试工具和库来调试您的 Python 代码!

Python 是一种通用的、高级的、面向对象的编程语言,用于许多开发目的。 此外,它还是适用于不同应用程序的有效开发工具,从 Web 应用程序开发到 Web 抓取以及更复杂的应用程序(如机器学习和数据科学)。

在开发过程中,很容易出现被称为编程错误的错误。 开发人员采取几个步骤来检测和消除代码中现有的和潜在的错误。 因此,您可以防止程序代码崩溃。 我们将此过程称为调试。

本文将介绍您可以使用的几个可用的 Python 调试器。 我们还将看到这些调试器彼此之间有多么不同,以及是什么使它们的实现有效。

cProfiler 调试库

cProfiler 是一个流行的库和一个执行长时间运行代码分析的 C 扩展。 从长远来看,它会识别需要很长时间才能运行的程序代码部分。 尽管它确定了运行代码不同部分的准确时间,但它并不能完全识别或修复代码中的错误。

因此,需要使用其他调试器。

幸运的是,您可以使用推荐的库(如 ipdb、Django-debug-toolbar、pyelftools、viztracer 和 py-spy)作为 Python 代码的调试工具。

ipdb调试工具

完全启用 IPython 的 Python 调试器是包含 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_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 开发人员的另一个高效调试工具。

使用 icecream,也就是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| x: 12 ,然后ic| y: 48 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级trace。
  • 它使用 RegEx 记录任意函数和额外信息,如变量和属性、引发的异常、垃圾收集器操作等,而无需修改源代码中的任何代码部分。
  • 使 viztracer 成为低开销调试工具的原因在于它能够过滤掉程序中不需要的数据。 然后,它会在以 JSON 格式转储日志之前保留旧信息。
  • 您可以使用它在程序运行时插入自定义事件,例如即时事件、变量事件和持续时间事件。 这样,它就像打印调试一样工作,除了 viztracer 会在您跟踪数据时让您知道打印发生的时间。

结论

Python 分析和调试就像软件分析一样是开发中需要注意的关键步骤。 此步骤有助于排除任何有 bug 的代码段,从而优化代码的整体性能。

我们上面介绍的调试工具是使 Python 开发人员的工作非常轻松的高效工具。

看到其他调试工具比 cProfiler 更有效地工作,您可以像真正的英雄一样调试您的 Python 代码并使用这些调试器修复任何潜在的错误,以防止您的代码在不崩溃的情况下运行。

调试愉快!