一、静态代码关系图
工具1、pyreverse
pyreverse 是一个由 Logilab 开发的 Python 工具,它能够自动生成 UML (统一建模语言) 类图,这些类图基于 Python 源代码。pyreverse 可以分析 Python 代码,并从中提取出类、模块、函数、方法和它们之间的关系,然后生成图形化的表示,这对于理解和设计复杂的软件系统非常有用。
pyreverse 已经集成到pylint里面了,帮助文档地址:https://pylint.readthedocs.io/en/stable/pyreverse.html
在命令行使用pip安装命令pylint即可:pip install pylint
安装完成后就可以在windows命令行使用pyreverse命令
使用pyreverse解析一个包
命令行输入pyreverse D:\pytest\pyan,解析pyan包
运行完成后命令行运行目录下会生成两个文件:classes.dot、packages.dot
命令行使用dot命令将dot 文件转换为svg文件(浏览器可打开svg文件)
dot -Tsvg classes.dot -o classes.svg
dot -Tsvg packages.dot -o packages.svg
查看packages.svg文件
classes.svg太大了,不截图了
这里有一个坑,pyreverse 需要解析的报目录下有__init__.py文件。如果没有就会报错。如果缺少 __init__.py 文件,我们可以在目录中自己手工创建一个__init__.py的空文件即可,重新运行pyreverse就不会报错了。
使用pyreverse解析一个文件
命令行输入命令pyreverse D:\pytest\pyan\writers.py,解析writers.py文件
因为只是一个文件,所以并没有生成packages.dot,只生成了classes.dot
vscode也有pylint的插件,可以安装使用
工具2、pyan
pyan是一个 Python 工具,用于生成 Python 代码的静态分析报告,包括函数调用图。它可以帮助你理解代码的执行流程,特别是对于大型项目或者新接手的项目。
使用pyan解析一个包
在命令行输入pyan3 D:\pytest\pyan\*.py -v -e --svg > pyan.svg
解析结果太大了,不截图了
使用pyan解析一个文件
在命令行输入pyan3 D:\pytest\pyan\writers.py -v -e --svg > pyan.svg
对比pyreverse,可以看到pyan3到方法级的引用了,而pyreverse只是到类级,pyan3可以看的更细致些(头晕些)
二、动态调用关系图
pycallgraph 是一个用于 Python 应用程序的图形化调用跟踪工具。它可以帮助你可视化 Python 代码的执行流程,生成函数调用图(Call Graph)。这对于理解和分析代码结构特别有用,尤其是在处理大型项目或复杂逻辑时。
安装:pip install pycallgraph2(有个坑,注意不是pip install pycallgraph)
#!/usr/bin/env python
'''
This example demonstrates a simple use of pycallgraph.
'''
from pycallgraph2 import PyCallGraph
from pycallgraph2.output import GraphvizOutputclass Banana:def eat(self):passclass Person:def __init__(self):self.no_bananas()def no_bananas(self):self.bananas = []def add_banana(self, banana):self.bananas.append(banana)def eat_bananas(self):[banana.eat() for banana in self.bananas]self.no_bananas()def main():graphviz = GraphvizOutput()graphviz.output_file = 'basic.png'with PyCallGraph(output=graphviz):person = Person()for a in range(10):person.add_banana(Banana())person.eat_bananas()if __name__ == '__main__':main()
另外,vscode开发环境中也可以使用一些插件来辅助调试,查看代码调试的动态情况,例如debug-visualizer