由於要重構項目的部分代碼,要整理好主要的函數調用關系,不想自己看代碼慢慢畫出結構,想找出一種通用的,節省人力的方法得出函數間的調用關系圖,於是發現以下幾個工具。(內網沒裝好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、使用
生成圖片: