使用这些库和工具像英雄一样调试 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 代码并使用这些调试器修复任何潜在的错误,以防止您的代码在不崩溃的情况下运行。
调试愉快!