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

8 浏览
0 Comments

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

我继承了一堆Python文件,想要通过收集关于这些文件中定义和调用的所有函数的信息来了解其中的情况。例如一个文件(MainModule.py):

导入module1
导入module2
导入module3
 
...
定义 func1():
...
定义 func2():
...
 
result1 = Module1.funcX(args)
result2 = Module2.funcY(args)
...

通过查看这个文件,我希望IDE报告这个文件中定义了哪些函数(这是我可以在Wing IDE中做到的),以及调用了哪些函数(这些函数在同一文件夹或项目中的.py文件中定义)。显然,我不想报告使用Python系统函数(如print()等),只想报告在我的项目中定义的函数(可以是一个文件夹,无关紧要)。

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

我知道在WingIDE中使用“查找使用点”和“转到定义”,但是阅读20个文件以查找函数会太繁琐。

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

0
0 Comments

最近,原始的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()

请记住,您需要在没有调试器的情况下运行它(在vscode中按Ctrl+F5)。

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

生成的图像:

Generated image

0
0 Comments

生成动态语言的函数调用图通过静态分析基本上是不可能的(即使对于简单的例子,也可能存在近似的方法)。因此,通常是在运行时通过动态方式完成,通过使用类似于pycallgraph(https://pypi.python.org/pypi/pycallgraph)的工具。

因此,良好的单元测试覆盖率对于Python代码非常重要。如果单元测试不足,改进单元测试覆盖率很可能是在进行重构之前非常有价值的一步。

这里有一个之前的StackOverflow问题,也涉及到这个问题:Build a Call graph in python including modules and functions?

谢谢,我无法让pycallgraph与graphviz配合工作,所以我想我需要通过使用IDE和代码搜索工具来进行半自动化操作。

0