2

我继承了一堆 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 points of use 和 Goto 定义,但是通读 20 个文件来查找函数太麻烦了。

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

4

2 回答 2

2

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

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

这是以前的 StackOverflow 问题,也涉及到这一点:在 python 中构建调用图,包括模块和函数?

于 2014-12-03T11:12:41.720 回答
1

目前不再维护原始的 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扩展名才能查看它。

生成的图像:

生成的图像

于 2021-11-06T17:11:48.793 回答