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

python: How to trace function execution order in large project

我想在 scrapy 框架中跟踪 function/class 执行命令。默认项目中有多个*.py文件,我想知道哪个py文件和class是按顺序执行的。在每个 class 和函数中放置记录器行听起来很愚蠢。如何可视化这个顺序?

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

追踪

The trace module allows you to trace program execution, generate annotated statement coverage listings, print caller/callee relationships and list functions executed during a program run. It can be used in another program or from the command line.

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

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

PDB

The module pdb defines an interactive source code debugger for Python programs. It supports setting (conditional) breakpoints and single stepping at the source line level, inspection of stack frames, source code listing, and evaluation of arbitrary Python code in the context of any stack frame. It also supports post-mortem debugging and can be called under program control.

最常用的命令:

w(此处)

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

d(自己)

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

u(p)

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

你也可以看看这个问题Python debugging tips

覆盖范围

Coverage.py measures code coverage, typically during test execution. It uses the code analysis tools and tracing hooks provided in the Python standard library to determine which lines are executable, and which have been executed.

猎人

Hunter is a flexible code tracing toolkit, not for measuring coverage, but for debugging, logging, inspection and other nefarious purposes.

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

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

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

终端结果:

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

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

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

pip install viztracer
viztracer your_script.py

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