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()
復制代碼

運行代碼,生成basic.png:

官網:

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


 3、objgraph

( objgraph 和函數關系調用沒什么關系,但是由於也使用dot,所以一並介紹。)

objgraph模塊 一般用於分析python對象相關問題,如內存泄漏。

3.1、下載安裝

可官網源碼安裝,也可使用pip安裝:

pip install objgraph

3.2、使用

生成圖片:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM