[英]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为 Python 程序定义了一个交互式源代码调试器。 它支持在源代码行级别设置(条件)断点和单步执行、堆栈帧检查、源代码列表以及在任何堆栈帧的上下文中评估任意 Python 代码。 它还支持事后调试,可以在程序控制下调用。
最常用的命令:
在哪里)
下)
向上)
你也可以检查这个问题Python调试技巧
Coverage.py测量代码覆盖率,通常在测试执行期间。 它使用 Python 标准库中提供的代码分析工具和跟踪钩子来确定哪些行是可执行的,哪些已被执行。
Hunter是一个灵活的代码跟踪工具包,不是用于测量覆盖率,而是用于调试、日志记录、检查和其他恶意目的。
默认操作是只打印正在执行的代码。 例子:
import hunter
hunter.trace(module='posixpath')
import os
os.path.join('a', 'b')
那么跟踪函数执行顺序的最佳工具绝对是viztracer 。 我不得不说,在理解一个更大的项目时,可视化是一个重要的因素。
与冷终端 ascii 相比,像这样的交互式图像可以更容易地理解程序中发生的事情。
此外,它是一种非侵入式工具,这意味着您无需编写一行代码。 只需安装它并用它运行你的程序。
pip install viztracer
viztracer your_script.py
这里的另一个重要因素是 viztracer 支持多线程和多进程,并且可以在同一时间线上的不同信号中将它们可视化,这是终端显示永远无法实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.