python函数调用关系图(python call graph)

 

 

由于要重构项目的部分代码,要整理好主要的函数调用关系,不想自己看代码慢慢画出结构,想找出一种通用的,节省人力的方法得出函数间的调用关系图,于是发现以下几个工具。(内网没装好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()
View Code

运行代码,生成basic.png:

官网:

http://pycallgraph.slowchop.com/en/master/index.html


 3、objgraph

( objgraph 和函数关系调用没什么关系,但是由于也使用dot,所以一并介绍。)

objgraph模块 一般用于分析python对象相关问题,如内存泄漏。

3.1、下载安装

可官网源码安装,也可使用pip安装:

pip install objgraph

3.2、使用

生成图片:

更多用法可参考官网:

http://mg.pov.lt/objgraph/

posted @ 2017-07-12 15:23  heaventouch  阅读(18955)  评论(1编辑  收藏  举报