python:如何跟踪大型项目

时间:2018-05-28 03:47:05

标签: python visualization profile trace execution

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

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

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

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

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

终于我使用Hunter解决了,这比内置跟踪模块更好。跟踪模块未提供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

2 个答案:

答案 0 :(得分:6)

微量

  

trace模块允许您跟踪程序执行,生成   带注释的语句覆盖列表,打印呼叫者/被呼叫者   程序运行期间执行的关系和列表函数。它可以   用于其他程序或命令行。

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

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

PDB

  

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

最常用的命令:

<强> W(在这里)

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

<强> d(自己)

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

<强> U(p)的

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

您还可以查看此问题Python debugging tips

覆盖范围

  

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

亨特

  

Hunter是一个灵活的代码跟踪工具包,不适用于测量覆盖范围,   但是用于调试,记录,检查和其他恶意目的。

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

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

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

终端结果: Hunter Result in terminal

答案 1 :(得分:0)

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

enter image description here

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

此外,它也是一种非侵入式工具,这意味着您无需编写任何代码。只需安装并运行它即可。

pip install viztracer
viztracer your_script.py

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