由于要重构项目的部分代码,要整理好主要的函数调用关系,不想自己看代码慢慢画出结构,想找出一种通用的,节省人力的方法得出函数间的调用关系图,于是发现以下几个工具。(内网没装好graphviz,还没真正用上)
主要分下面三个模块了解一下python中如何生成函数关系调用图:
1、graphviz(Graph Visualization Software-图形可视化软件)
2、pycallgraph(创建python的可视化图形)
3、objgraph(查看python对象图)
1、graphviz
graphviz 是一个图形可视化软件,可使用dot文件生成关系图。
1.1、下载安装
官网下载安装包进行安装,有Linux和Windows版本。
或者直接用命令安装: sudo apt-get install graphviz
1.2、使用
安装后可使用dot命令将dot文件生成图片:
dot -Tpng *.dot -o *.png
更多用法可参考官网文档。
http://www.graphviz.org/Home.php
还有一个pygraphviz 不要和 下面介绍的pycallgraph混淆了。pygraphviz是用Python封装了graphviz使其可用python编写。
pygraphviz官网:http://pygraphviz.github.io/index.html
2、pycallgraph
pycallgraph 可以创建python函数关系可视化图形,因为其依赖于dot命令,需要先安装 graphviz。
2.1、下载安装
官网源码安装或使用pip:
pip install pycallgraph
2.2、使用
命令行使用(没试过):
pycallgraph graphviz -- ./mypythonscript.py
代码中使用:
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
code_to_profile()
例子:
1 #!/usr/bin/env python 2 ''' 3 This example demonstrates a simple use of pycallgraph. 4 ''' 5 from pycallgraph import PyCallGraph 6 from pycallgraph.output import GraphvizOutput 7 8 9 class Banana: 10 11 def eat(self): 12 pass 13 14 15 class Person: 16 17 def __init__(self): 18 self.no_bananas() 19 20 def no_bananas(self): 21 self.bananas = [] 22 23 def add_banana(self, banana): 24 self.bananas.append(banana) 25 26 def eat_bananas(self): 27 [banana.eat() for banana in self.bananas] 28 self.no_bananas() 29 30 31 def main(): 32 graphviz = GraphvizOutput() 33 graphviz.output_file = 'basic.png' 34 35 with PyCallGraph(output=graphviz): 36 person = Person() 37 for a in xrange(10): 38 person.add_banana(Banana()) 39 person.eat_bananas() 40 41 42 if __name__ == '__main__': 43 main()
运行代码,生成basic.png:
官网:
http://pycallgraph.slowchop.com/en/master/index.html
3、objgraph
( objgraph 和函数关系调用没什么关系,但是由于也使用dot,所以一并介绍。)
objgraph模块 一般用于分析python对象相关问题,如内存泄漏。
3.1、下载安装
可官网源码安装,也可使用pip安装:
pip install objgraph
3.2、使用
生成图片:
更多用法可参考官网: