繁体   English   中英

从多个 Python 文件生成函数调用树

[英]Generate function calls tree from multiple Python files

我继承了一堆 Python 文件,并通过收集有关在这些文件中定义和调用的所有函数的信息,寻找一种方法来了解其中发生的事情。

文件示例(MainModule.py):

Import module1
Import module2
Import module3
 
...
Def func1():
...
Def func2():
...
 
result1 = Module1.funcX(args)
result2 = Module2.funcY(args)
...

通过查看这个文件,我希望 IDE 报告在这个文件中定义了哪些函数(这是我可以用 Wing IDE 做的事情),还有哪些函数(在位于同一文件夹中的 .py 文件中定义的)或项目)被调用。 显然,我不想报告 Python 系统函数的使用(例如print()等),而只想报告在我的项目中的文件中定义的那些函数(可能是文件夹,并不重要)。

所以在这个例子中,我想得到这样的东西:在文件 MainFunction.py 中,函数 funcX 和 funcY 分别从 Module1.py 文件和 Module2.py 文件中调用 我将使用此信息在 Visio(或其他一些软件)中构建参考架构,我将在重构代码时使用该架构。

我知道在 WingIDE 中使用 Find point of use 和 Goto 定义,但通读 20 个文件寻找函数会太麻烦。

我使用过 PyScripter 和 WingIDE Pro,但这些 IDE 似乎缺少此功能。 什么IDE支持这种操作? 如果没有,有没有其他直接的方法来实现这一目标?

通过静态分析生成动态语言的调用图实际上是不可能的(即使对于简单的示例来说可能是近似的)。 因此,通常使用诸如pycallgraph( https://pypi.python.org/pypi/pycallgraph )之类的方法在运行时动态完成。

因此,良好的Python代码单元测试覆盖至关重要。 如果缺少单元测试,那么在进行重构之前,提高单元测试的覆盖率可能是非常有价值的一步。

这是之前的StackOverflow问题,也涉及到此问题: 用python构建包括模块和函数的调用图?

目前不再维护原始 pycallgraph。 使用 Python 3.9 时我什至无法安装它。

但是创建了一些分支,最近活跃的是 CallGraph4Py:

在 Windows 上记得安装 Graphviz ,这是生成图像所必需的。

用法示例:

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

def a1():
    print("a1")

def a2():
    print("a2")

def a3():
    a1()
    print("a3")

def a4():
    a3()
    a2()
    print("a4")

with PyCallGraph(output=GraphvizOutput()):
    a4()

它在项目文件夹中生成None文件名的图像,需要添加.png扩展名才能查看它。

生成的图像:

生成的图像

暂无
暂无

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

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