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

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

Python是一种通用的、高级的、面向对象的编程语言,用于许多开发目的。此外,它是一种有效的开发工具,可用于从Web应用程序开发到web scraping等更复杂的应用程序,如机器学习和数据科学。

在开发过程中,编程中的错误(称为错误)容易发生。开发人员采取多种措施来检测和消除代码中存在的和潜在的错误。因此,可以防止程序代码崩溃。我们称之为调试。

本文将介绍几种可用的Python调试器。我们还将看到这些debuggers与其他调试器的不同之处,以及它们的实现方式。

cProfiler调试库

cProfiler是一种流行的库和C扩展,用于执行长时间运行的代码的分析。从长远来看,它确定了程序代码中运行时间较长的部分。尽管它可以确定代码的不同部分运行所花费的确切时间,但它并不能完全确定和修复代码中的错误。

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

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

ipdb调试工具

IPython启用的Python调试器是一个交互式的第三方调试器,它包含了pdb的功能。同时,它还支持交互式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 file,其中test.py是我的文件名:

python -m ipdb test.py

ipdb的导入和运行ipdb.set_trace()函数允许程序的开始并通过执行运行调试器。

ipdb.pm()函数(post-mortem)的功能类似于%debug魔术函数。

set_trace参数

将上下文作为参数传递给set_trace,以显示定义的多行代码。此外,set_trace还接受cond作为参数,它接受布尔值,并且当将cond设置为true时启动ipdb界面。

使用配置文件

将上下文参数设置为idpdb文件或位于主文件夹和项目文件夹中的setup.cfg文件。欢迎进一步了解ipdb的功能。

Django Debug工具栏

Django debug toolbar是Django中的一种流行的调试工具:一个Python框架。

这个可配置的面板集显示当前请求或响应的调试信息。单击工具栏时,会显示有关面板内容的更多详细信息。

这个工具彻底检查了Django开发环境。

请按照安装过程和配置说明here

Pyelftools库

pyelftools库完全基于Python构建。它解析和分析ELF文件和DWARF调试信息,仅需要Python来运行。

使用Pyelftools很容易,因为它没有外部库的要求。此外,使用pyelftools无需安装也很容易,只需要在环境变量中调整PYTHONPATH即可。

您可以使用以下命令进行安装:

pip install pyelftools

只需导入pyelftools并在程序中调用即可实现pyelftools的功能。

icecream 🍦调试工具

这是另一个对Python开发人员非常高效的调试工具。

使用icecream,也可以使用ic(),相比print()具有以下许多优点:

  • 输入速度相对更快。
  • 它能够很好地打印数据结构。
  • 使用ic()打印表达式或变量名及其值。
  • 它突出显示输出的语法。
  • 可选择包含程序上下文,包括文件名、行号和父函数。

在使用这个包之前,请使用下面的pip命令进行安装:

pip install icecream

好处是,您无需在所有文件中都导入它,只需通过使用install()安装即可。此外,install()ic()添加到内置模块。解释器导入的所有文件都将共享ic()

在第一个根Python文件中,可以命名为x.py,使用install()添加ic()

from icecream import install
install()
from y import mult
mult()

在导入x.py文件的y.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编写的,因此开销很低。

此外,需要考虑的是,使用py-spy对生产Python代码进行调试是安全的,因为它与被分析的Python程序运行在不同的进程中。

与我们之前看到的其他工具一样,安装py-spy后即可使用。

pip install py-spy

即使您的Python程序提供生产流量,仍然可以使用py-spy对该程序进行配置和调试,使其成为重要的Python分析工具。

Viztracer调试器

另外,您可以使用viztracer作为调试工具,跟踪和可视化Python程序的执行过程。它还是一个具有低开销日志记录的性能分析工具。

viztracer之所以成为一种有效的调试工具,是因为:

  • 使用它非常容易,且不依赖外部包来工作。
  • Viztracer适用于所有操作系统平台:Windows、Linux或macOS。
  • 它功能强大的前端可以平滑地渲染GB级别的跟踪。
  • 它使用正则表达式记录任意函数和额外信息,如variables and attributesRaised ExceptionsGarbage Collector operations等,而不修改源代码中的任何代码部分。
  • viztracer是一个低开销的调试工具,它能够过滤掉程序中不需要的数据。然后在以JSON格式记录日志之前保留旧信息。
  • 您可以在程序运行时插入自定义事件,例如instant eventvariable eventDuration event。这样,它就像一个打印调试,但是viztracer会在追踪数据时告诉您何时发生打印。

结论

Python的性能分析和调试,就像software profiling一样,是开发中需要关注的关键步骤。这一步骤有助于排除任何存在错误的代码部分,以优化代码的整体性能。

我们上面介绍的调试工具都是高效的工具,可以使Python开发人员的工作变得非常简单。

考虑到其他调试工具比cProfiler更有效,您可以像一个真正的英雄一样,使用这些调试器调试您的Python代码和fix any potential bugs,以防止代码运行时崩溃。

快乐调试!

类似文章