文章目錄
- 1. 引言
- 2. 繪制UML類圖
- 2.1 安裝graphviz
- 2.2 安裝pyreverse
- 2.3 繪制UML類圖
- 3. 繪制函式呼叫圖
- 3.1 安裝graphviz
- 3.2 安裝pycallgraph
- 3.3 使用示例
- 第一種:從命令列呼叫
- 第二種:從API呼叫
- 小結
1. 引言
在設計軟體、分析代碼時,我們常常會借助UML以及函式呼叫圖,來幫自己梳理思路,
尤其是遇到bug時,借助這些可視化手段,也可以幫你在除錯程序中發現邏輯錯誤,
本文主要介紹以下兩個方法:
-
借助graphviz+pyreverse,自動提取python代碼的UML類圖和包依賴關系,
-
借助graphviz+pycallgraph,自動提取python代碼的動態呼叫流程圖,
2. 繪制UML類圖
2.1 安裝graphviz
Graphviz 是一個開源圖形可視化軟體,
Graphviz 以簡單的文本語言對圖形進行描述,并以多種有用的格式制作圖表,例如用于網頁的影像和 SVG,用于包含在 PDF 或其他檔案中的 Postscript;或顯示在互動式圖形瀏覽器中,
步驟①:從官網下載graphviz軟體
官網下載:http://www.graphviz.org/download/
下載exe安裝包,完成graphviz軟體安裝,并找到bin路徑,
步驟②:設定環境變數

步驟③:安裝對應python庫
$ conda install python-graphviz
2.2 安裝pyreverse
pyreverse是一組用于對 Python 代碼進行逆向工程的實用程式,
可以分析Python代碼并提取 UML 類圖和包依賴關系1:
- 類屬性,及其型別
- 類方法
- 類之間的繼承鏈接
- 類之間的關聯鏈接
- 例外和介面的表示
Pyreverse 現在已集成到 pylint 中:http://pypi.python.org/pypi/pylint/
安裝pylint:
$ pip install pylint
注意:pip install pyreverse時,會發現已經找不到這個庫了:ERROR: Could not find a version that satisfies the requirement pyreverse,不過pylint中已經包含了pyreverse,所以直接安裝pylint即可,
2.3 繪制UML類圖
UML類圖常用于面向物件的建模中,UML類圖的每個方框是一個物件類,每個框從上到下分為三部分,第一部分是物件類名稱,第二部分是類的屬性,第三部分是類的函式,
在命令列輸入陳述句,生成package的UML圖:
$ pyreverse -o png -p Pyreverse pylint/pyreverse/
[...]
creating diagram packages_Pyreverse.png
creating diagram classes_Pyreverse.png
- -o :設定保存影像的格式,如png
- -p Name: 輸出圖形以packages_Name.png為名稱保存

3. 繪制函式呼叫圖
函式呼叫圖(Call Graph)是一個控制流程圖,用于表示程式中各個單元之間的呼叫關系,每個節點之間的邊緣表示呼叫程序,回圈曲線表示遞回程序呼叫,2
繪制Call Graph的常用工具有:pycallgraph、pyan(靜態呼叫圖)、gprof2dot 、code2flow等,本文主要介紹pycallgraph的用法,
pycallgraph是一個python模塊,可以對python代碼進行動態呼叫圖分析3,包括模塊之間的呼叫流程、函式呼叫次數及耗時等,

3.1 安裝graphviz
同2.1節,
步驟①:從官網下載graphviz軟體
官網下載:http://www.graphviz.org/download/
下載exe安裝包,完成graphviz軟體安裝,并找到bin路徑,
步驟②:設定環境變數

步驟③:安裝對應python庫
$ pip install graphviz
3.2 安裝pycallgraph
安裝pycallgraph:
$ pip install pycallgraph
3.3 使用示例
第一種:從命令列呼叫
$ pycallgraph graphviz -- ./mypythonscript.py
第二種:從API呼叫
最簡單的例子,直接在要分析的函式呼叫前,加上with PyCallGraph(output=GraphvizOutput())::
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
with PyCallGraph(output=GraphvizOutput()):
# 呼叫你要分析的函式
code_to_profile()
如果需要指定呼叫圖中包含(include)哪些函式、排除(exclude)哪些函式,就要用到GlobbingFilter(include=[....])、GlobbingFilter(exclude=[....]),例如這樣4:
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput
from pycallgraph import Config
from pycallgraph import GlobbingFilter
def main():
# TODO: 呼叫各種類、函式
return
if __name__ == "__main__":
config = Config()
# 呼叫圖中包括(include)哪些函式
# 用moduleName.*表示,包含某個模塊內的所有函式
config.trace_filter = GlobbingFilter(include=[
'main',
'app.*',
'widgets.list_widget.*',
'utils.RegionInfo.*'
])
# 呼叫圖中不包括(exclude)哪些函式
# config.trace_filter = GlobbingFilter(exclude=[
# 'moduleA.*',
# 'moduleB.*',
# '*.funcB'
# ])
graphviz = GraphvizOutput()
graphviz.output_file = 'graph.png'
with PyCallGraph(output=graphviz, config=config):
main()
在程式正常運行完之后,就會在當前路徑生成graph.png檔案,
越是復雜的程式,生成的呼叫圖就會越大,注意選取你最關注的函式進行可視化,

其他高級用法可以參考:
官方檔案:https://pycallgraph.readthedocs.io/en/master/
小結
本文介紹了兩個python代碼可視化工具:
-
借助graphviz+pyreverse,可以自動提取python代碼的UML類圖,
-
借助graphviz+pycallgraph,可以自動提取python代碼的動態呼叫圖,
如果對你有幫助的話,歡迎一鍵三連支持下博主,
https://www.logilab.org/blogentry/6883 ??
https://encyclopedia.thefreedictionary.com/Call+graph ??
https://zhuanlan.zhihu.com/p/108481835 ??
https://blog.csdn.net/qq_37177765/article/details/95886071 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/312512.html
標籤:python
上一篇:Java中String陣列的排序
下一篇:在C#中計算100分之一的秒數
