成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python自動(dòng)繪制UML圖、函數(shù)調(diào)用圖(Call Graph)

widuu / 5417人閱讀

摘要:借助,自動(dòng)提取代碼的動(dòng)態(tài)調(diào)用流程圖。繪制類圖安裝是一個(gè)開源圖形可視化軟件。循環(huán)曲線表示遞歸過(guò)程調(diào)用。繪制的常用工具有靜態(tài)調(diào)用圖等。包括模塊之間的調(diào)用流程函數(shù)調(diào)用次數(shù)及耗時(shí)等。

1. 引言

在設(shè)計(jì)軟件、分析代碼時(shí),我們常常會(huì)借助UML以及函數(shù)調(diào)用圖,來(lái)幫自己梳理思路。

尤其是遇到bug時(shí),借助這些可視化手段,也可以幫你在調(diào)試過(guò)程中發(fā)現(xiàn)邏輯錯(cuò)誤。

本文主要介紹以下兩個(gè)方法:

  • 借助graphviz+pyreverse,自動(dòng)提取python代碼的UML類圖和包依賴關(guān)系。

  • 借助graphviz+pycallgraph,自動(dòng)提取python代碼的動(dòng)態(tài)調(diào)用流程圖。

2. 繪制UML類圖

2.1 安裝graphviz

Graphviz 是一個(gè)開源圖形可視化軟件。

Graphviz 以簡(jiǎn)單的文本語(yǔ)言對(duì)圖形進(jìn)行描述,并以多種有用的格式制作圖表,例如用于網(wǎng)頁(yè)的圖像和 SVG,用于包含在 PDF 或其他文檔中的 Postscript;或顯示在交互式圖形瀏覽器中。

步驟①:從官網(wǎng)下載graphviz軟件

官網(wǎng)下載:http://www.graphviz.org/download/

下載exe安裝包,完成graphviz軟件安裝,并找到bin路徑。

步驟②:設(shè)置環(huán)境變量


步驟③:安裝對(duì)應(yīng)python庫(kù)

$ conda install python-graphviz

2.2 安裝pyreverse

pyreverse是一組用于對(duì) Python 代碼進(jìn)行逆向工程的實(shí)用程序。

可以分析Python代碼并提取 UML 類圖和包依賴關(guān)系1

  • 類屬性,及其類型
  • 類方法
  • 類之間的繼承鏈接
  • 類之間的關(guān)聯(lián)鏈接
  • 異常和接口的表示

Pyreverse 現(xiàn)在已集成到 pylint 中:http://pypi.python.org/pypi/pylint/

安裝pylint

$ pip install pylint

注意:pip install pyreverse時(shí),會(huì)發(fā)現(xiàn)已經(jīng)找不到這個(gè)庫(kù)了:ERROR: Could not find a version that satisfies the requirement pyreverse,不過(guò)pylint中已經(jīng)包含了pyreverse,所以直接安裝pylint即可。

2.3 繪制UML類圖

UML類圖常用于面向?qū)ο蟮慕V校琔ML類圖的每個(gè)方框是一個(gè)對(duì)象類,每個(gè)框從上到下分為三部分,第一部分是對(duì)象類名稱,第二部分是類的屬性,第三部分是類的函數(shù)。

在命令行輸入語(yǔ)句,生成package的UML圖:

$ pyreverse -o png -p Pyreverse pylint/pyreverse/[...]creating diagram packages_Pyreverse.pngcreating diagram classes_Pyreverse.png
  • -o :設(shè)置保存圖像的格式,如png
  • -p Name: 輸出圖形以packages_Name.png為名稱保存

3. 繪制函數(shù)調(diào)用圖

函數(shù)調(diào)用圖(Call Graph)是一個(gè)控制流程圖,用于表示程序中各個(gè)單元之間的調(diào)用關(guān)系。每個(gè)節(jié)點(diǎn)之間的邊緣表示調(diào)用過(guò)程。循環(huán)曲線表示遞歸過(guò)程調(diào)用。2

繪制Call Graph的常用工具有:pycallgraph、pyan(靜態(tài)調(diào)用圖)、gprof2dot 、code2flow等。本文主要介紹pycallgraph的用法。

pycallgraph是一個(gè)python模塊,可以對(duì)python代碼進(jìn)行動(dòng)態(tài)調(diào)用圖分析3。包括模塊之間的調(diào)用流程、函數(shù)調(diào)用次數(shù)及耗時(shí)等。

3.1 安裝graphviz

同2.1節(jié)。

步驟①:從官網(wǎng)下載graphviz軟件

官網(wǎng)下載:http://www.graphviz.org/download/

下載exe安裝包,完成graphviz軟件安裝,并找到bin路徑。

步驟②:設(shè)置環(huán)境變量


步驟③:安裝對(duì)應(yīng)python庫(kù)

$ pip install graphviz

3.2 安裝pycallgraph

安裝pycallgraph:

$ pip install pycallgraph

3.3 使用示例

第一種:從命令行調(diào)用

$ pycallgraph graphviz -- ./mypythonscript.py

第二種:從API調(diào)用

最簡(jiǎn)單的例子,直接在要分析的函數(shù)調(diào)用前,加上with PyCallGraph(output=GraphvizOutput()):

from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput()):	# 調(diào)用你要分析的函數(shù)    code_to_profile()

如果需要指定調(diào)用圖中包含(include)哪些函數(shù)、排除(exclude)哪些函數(shù),就要用到GlobbingFilter(include=[....])、GlobbingFilter(exclude=[....]),例如這樣4

from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputfrom pycallgraph import Configfrom pycallgraph import GlobbingFilterdef main():	# TODO: 調(diào)用各種類、函數(shù)	return	if __name__ == "__main__":	config = Config()    # 調(diào)用圖中包括(include)哪些函數(shù)    # 用moduleName.*表示,包含某個(gè)模塊內(nèi)的所有函數(shù)    config.trace_filter = GlobbingFilter(include=[        "main",        "app.*",        "widgets.list_widget.*",        "utils.RegionInfo.*"    ])        # 調(diào)用圖中不包括(exclude)哪些函數(shù)    # config.trace_filter = GlobbingFilter(exclude=[    #     "moduleA.*",    #     "moduleB.*",    #     "*.funcB"    # ])        graphviz = GraphvizOutput()    graphviz.output_file = "graph.png"    with PyCallGraph(output=graphviz, config=config):        main()

程序正常運(yùn)行完之后,就會(huì)在當(dāng)前路徑生成graph.png文件。

越是復(fù)雜的程序,生成的調(diào)用圖就會(huì)越大,注意選取你最關(guān)注的函數(shù)進(jìn)行可視化。

其他高級(jí)用法可以參考:

官方文檔:https://pycallgraph.readthedocs.io/en/master/

小結(jié)

本文介紹了兩個(gè)python代碼可視化工具:

  • 借助graphviz+pyreverse,可以自動(dòng)提取python代碼的UML類圖。

  • 借助graphviz+pycallgraph,可以自動(dòng)提取python代碼的動(dòng)態(tài)調(diào)用圖

如果對(duì)你有幫助的話,歡迎一鍵三連支持下博主。


  1. https://www.logilab.org/blogentry/6883 ??

  2. https://encyclopedia.thefreedictionary.com/Call+graph ??

  3. https://zhuanlan.zhihu.com/p/108481835 ??

  4. https://blog.csdn.net/qq_37177765/article/details/95886071 ??

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/122568.html

相關(guān)文章

  • Tensorflow代碼解析(四)

    摘要:聯(lián)合查找算法是并查集數(shù)據(jù)結(jié)構(gòu)一種應(yīng)用。并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),其保持著用于處理一些不相交集合的合并及查詢問題。的特征是刪除節(jié)點(diǎn)。目前就職于騰訊事業(yè)部,從事神經(jīng)機(jī)器翻譯工作。 5. TF - Graph模塊TF把神經(jīng)網(wǎng)絡(luò)模型表達(dá)成一張拓?fù)浣Y(jié)構(gòu)的Graph,Graph中的一個(gè)節(jié)點(diǎn)表示一種計(jì)算算子。Graph從輸入到輸出的Tensor數(shù)據(jù)流動(dòng)完成了一個(gè)運(yùn)算過(guò)程,這是對(duì)類似概率圖、神經(jīng)網(wǎng)絡(luò)等連接...

    馬龍駒 評(píng)論0 收藏0
  • Tensorflow代碼解析(一)

    摘要:本文依據(jù)對(duì)簡(jiǎn)稱白皮書和官方教程的理解,從系統(tǒng)和代碼實(shí)現(xiàn)角度講解的內(nèi)部實(shí)現(xiàn)原理。這一點(diǎn)是和包括在內(nèi)的符號(hào)編程框架較大的不同。的做法是引入了來(lái)處理。這樣就幾乎讓本身成為一門獨(dú)立的語(yǔ)言。當(dāng)為是,執(zhí)行操作當(dāng)為時(shí),執(zhí)行操作。支持的控制算子有和等。 摘要2015年11月9日,Google發(fā)布深度學(xué)習(xí)框架TensorFlow并宣布開源,并迅速得到廣泛關(guān)注,在圖形分類、音頻處理、推薦系統(tǒng)和自然語(yǔ)言處理等場(chǎng)景...

    李世贊 評(píng)論0 收藏0
  • 用 Matplotlib 庫(kù)生成動(dòng)畫

    摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引??梢允褂幂p松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...

    call_me_R 評(píng)論0 收藏0
  • 用 Matplotlib 庫(kù)生成動(dòng)畫

    摘要:相對(duì)于靜態(tài)圖表,人類總是容易被動(dòng)畫和交互式圖表所吸引。可以使用輕松生成圖表直方圖功率譜,條形圖,錯(cuò)誤圖表,散點(diǎn)圖等。然而,也有一些方面落后于同類的庫(kù)。動(dòng)畫使用一組固定的對(duì)象。稍后將用數(shù)據(jù)對(duì)行對(duì)象進(jìn)行填充?,F(xiàn)在用將它們轉(zhuǎn)換為動(dòng)畫。 翻譯:瘋狂的技術(shù)宅https://towardsdatascience.co... showImg(https://segmentfault.com/img...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • C++源碼調(diào)用生成器實(shí)現(xiàn)

    摘要:前言之前受知乎用戶啟發(fā),寫了個(gè)源碼的調(diào)用圖生成器,可以以圖示法顯示函數(shù)的調(diào)用關(guān)系,代碼放在了倉(cāng)庫(kù)里,僅供參考主要思路利用的的注入選項(xiàng),得到每個(gè)函數(shù)的調(diào)用地址信息,生成一個(gè)文件,然后利用和將函數(shù)名及其所在源碼位置從地址中解析出來(lái),從而得到 前言 之前受知乎用戶mailto1587啟發(fā),寫了個(gè)C++源碼的調(diào)用圖生成器,可以以圖示法顯示C++函數(shù)的調(diào)用關(guān)系,代碼放在了github倉(cāng)庫(kù)里,僅供...

    oysun 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<