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

資訊專欄INFORMATION COLUMN

Python自動繪制UML圖、函數調用圖(Call Graph)

widuu / 5259人閱讀

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

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.pngcreating 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 PyCallGraphfrom pycallgraph.output import GraphvizOutputwith PyCallGraph(output=GraphvizOutput()):	# 調用你要分析的函數    code_to_profile()

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

from pycallgraph import PyCallGraphfrom pycallgraph.output import GraphvizOutputfrom pycallgraph import Configfrom pycallgraph import GlobbingFilterdef 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代碼的動態調用圖

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


  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 ??

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/122568.html

相關文章

  • Tensorflow代碼解析(四)

    摘要:聯合查找算法是并查集數據結構一種應用。并查集是一種樹型的數據結構,其保持著用于處理一些不相交集合的合并及查詢問題。的特征是刪除節點。目前就職于騰訊事業部,從事神經機器翻譯工作。 5. TF - Graph模塊TF把神經網絡模型表達成一張拓撲結構的Graph,Graph中的一個節點表示一種計算算子。Graph從輸入到輸出的Tensor數據流動完成了一個運算過程,這是對類似概率圖、神經網絡等連接...

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

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

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

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

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

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

    不知名網友 評論0 收藏0
  • C++源碼調用生成器實現

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

    oysun 評論0 收藏0

發表評論

0條評論

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