繁体   English   中英

python:如何在大型项目中跟踪函数执行顺序

[英]python: How to trace function execution order in large project

我想在scrapy框架中跟踪函数/类执行顺序。 默认项目中有多个 *.py 文件,我想知道依次执行了哪个 py 文件和类。 将记录器行放在每个类和函数中听起来很愚蠢。 如何可视化这个订单?

cprofile 主要用于测量总时间。 我还可以可视化一个模块内的执行顺序,这是一个常见的问题,但可视化多个模块是很困难的。

在跟踪包方面,我没有找到合适的示例来处理像 scrapy 或 django 这样的大型项目。 跟踪使用教程是关于单个 python 文件的。

我想在一个大项目的多个模块中跟踪多个 *.py 文件,例如scrapy,而不是一个模块。

我知道像 pdb 这样的调试工具,但我发现在整个项目中放置断点很麻烦。 更重要的是,总结执行顺序并不容易。

最后我用Hunter解决了,比内置的trace模块好。 跟踪模块没有提供 include_dir 属性。

对于那些对如何追踪所有scrapy行感到好奇的人。

$PYTHONHUNTER='Q(module_startswith=["scrapy", "your_project"])' scrapy list 


在django方面,跟踪rest_framework的执行代码并保存到test.log,例如:

$PYTHONHUNTER='Q(module_startswith=["rest_framework", "your_project"]), action=CallPrinter(stream=open("test.log", "w"))' python manage.py runserver --noreload --nothreading

痕迹

跟踪模块允许您跟踪程序执行、生成带注释的语句覆盖列表、打印调用者/被调用者关系并列出程序运行期间执行的函数。 它可以在另一个程序中或从命令行中使用。

python -m trace --count -C . somefile.py ...

以上将执行somefile.py并生成在执行期间导入到当前目录的所有 Python 模块的带注释的列表。

PDB

模块pdb为 Python 程序定义了一个交互式源代码调试器。 它支持在源代码行级别设置(条件)断点和单步执行、堆栈帧检查、源代码列表以及在任何堆栈帧的上下文中评估任意 Python 代码。 它还支持事后调试,可以在程序控制下调用。

最常用的命令:

在哪里)

  • 打印堆栈跟踪,最新的帧在底部。 箭头指示当前帧,它决定了大多数命令的上下文。

下)

  • 将当前帧在堆栈跟踪中向下移动一级(到更新的帧)。

向上)

  • 在堆栈跟踪中将当前帧向上移动一级(到较旧的帧)。

你也可以检查这个问题Python调试技巧

覆盖范围

Coverage.py测量代码覆盖率,通常在测试执行期间。 它使用 Python 标准库中提供的代码分析工具和跟踪钩子来确定哪些行是可执行的,哪些已被执行。

猎人

Hunter是一个灵活的代码跟踪工具包,不是用于测量覆盖率,而是用于调试、日志记录、检查和其他恶意目的。

默认操作是只打印正在执行的代码。 例子:

import hunter
hunter.trace(module='posixpath')

import os
os.path.join('a', 'b')

结果在终端: Hunter 结果在终端

那么跟踪函数执行顺序的最佳工具绝对是viztracer 我不得不说,在理解一个更大的项目时,可视化是一个重要的因素。

在此处输入图片说明

与冷终端 ascii 相比,像这样的交互式图像可以更容易地理解程序中发生的事情。

此外,它是一种非侵入式工具,这意味着您无需编写一行代码。 只需安装它并用它运行你的程序。

pip install viztracer
viztracer your_script.py

这里的另一个重要因素是 viztracer 支持多线程和多进程,并且可以在同一时间线上的不同信号中将它们可视化,这是终端显示永远无法实现的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM