用这些库和工具像英雄一样调试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 attributes、Raised Exceptions、Garbage Collector operations等,而不修改源代码中的任何代码部分。
- viztracer是一个低开销的调试工具,它能够过滤掉程序中不需要的数据。然后在以JSON格式记录日志之前保留旧信息。
- 您可以在程序运行时插入自定义事件,例如instant event、variable event和Duration event。这样,它就像一个打印调试,但是viztracer会在追踪数据时告诉您何时发生打印。
结论
Python的性能分析和调试,就像software profiling一样,是开发中需要关注的关键步骤。这一步骤有助于排除任何存在错误的代码部分,以优化代码的整体性能。
我们上面介绍的调试工具都是高效的工具,可以使Python开发人员的工作变得非常简单。
考虑到其他调试工具比cProfiler更有效,您可以像一个真正的英雄一样,使用这些调试器调试您的Python代码和fix any potential bugs,以防止代码运行时崩溃。
快乐调试!