国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

widuu / 5205人閱讀

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

1. 引言

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

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

本文主要介紹以下兩個方法:

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

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

2. 繪制UML類圖

2.1 安裝graphviz

Graphviz 是一個開源圖形可視化軟件。

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

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

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

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

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


步驟③:安裝對應(yīng)python庫

$ conda install python-graphviz

2.2 安裝pyreverse

pyreverse是一組用于對 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時,會發(fā)現(xiàn)已經(jīng)找不到這個庫了:ERROR: Could not find a version that satisfies the requirement pyreverse,不過pylint中已經(jīng)包含了pyreverse,所以直接安裝pylint即可。

2.3 繪制UML類圖

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

在命令行輸入語句,生成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)是一個控制流程圖,用于表示程序中各個單元之間的調(diào)用關(guān)系。每個節(jié)點(diǎn)之間的邊緣表示調(diào)用過程。循環(huán)曲線表示遞歸過程調(diào)用。2

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

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

3.1 安裝graphviz

同2.1節(jié)。

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

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

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

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


步驟③:安裝對應(yīng)python庫

$ pip install graphviz

3.2 安裝pycallgraph

安裝pycallgraph:

$ pip install pycallgraph

3.3 使用示例

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

$ pycallgraph graphviz -- ./mypythonscript.py

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

最簡單的例子,直接在要分析的函數(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.*表示,包含某個模塊內(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)行完之后,就會在當(dāng)前路徑生成graph.png文件。

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

其他高級用法可以參考:

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

小結(jié)

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

  • 借助graphviz+pyreverse,可以自動提取python代碼的UML類圖

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

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


  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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/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中的一個節(jié)點(diǎn)表示一種計算算子。Graph從輸入到輸出的Tensor數(shù)據(jù)流動完成了一個運(yùn)算過程,這是對類似概率圖、神經(jīng)網(wǎng)絡(luò)等連接...

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

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

    李世贊 評論0 收藏0
  • 用 Matplotlib 庫生成動畫

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

    call_me_R 評論0 收藏0
  • 用 Matplotlib 庫生成動畫

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

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

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

    oysun 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<