<sub id="gqw76"><listing id="gqw76"></listing></sub>
      <sub id="gqw76"><listing id="gqw76"></listing></sub>

    1. <form id="gqw76"><legend id="gqw76"></legend></form>
    2. 使用pycallgraph分析python代碼函數調用流程以及框架

      技術背景

      在上一篇博客中,我們介紹了使用量子計算模擬器ProjectQ去生成一個隨機數,也介紹了隨機數的應用場景等。但是有些時候我們希望可以打開這里面實現的原理,去看看在產生隨機數的過程中經歷了哪些運算,調用了哪些模塊。只有梳理清楚這些相關的內容,我們才能夠更好的使用這個產生隨機數的功能。這里我們就引入一個工具pycallgraph,可以根據執行的代碼,給出這些代碼背后所封裝和調用的所有函數、類的關系圖,讓我們一起來了解下這個工具的安裝和使用方法。

      Manjaro Linux平臺安裝graphviz

      首先用pip安裝graphviz:

      [dechin@dechin-manjaro callgraph]$ python3 -m pip install graphviz
      Collecting graphviz
        Downloading graphviz-0.16-py2.py3-none-any.whl (19 kB)
      Installing collected packages: graphviz
      Successfully installed graphviz-0.16
      

      然后再安裝pycallgraph,這兩者有先后的依賴關系:

      [dechin@dechin-manjaro callgraph]$ python3 -m pip install pycallgraph
      Collecting pycallgraph
        Downloading pycallgraph-1.0.1.tar.gz (36 kB)
      Building wheels for collected packages: pycallgraph
        Building wheel for pycallgraph (setup.py) ... done
        Created wheel for pycallgraph: filename=pycallgraph-1.0.1-py3-none-any.whl size=35943 sha256=d0ee9415d7c268f6964f4a0fd1dc6ec3e039b6bedfe4844de6c1eb8fd0a61389
        Stored in directory: /home/dechin/.cache/pip/wheels/c1/6c/a0/22b61ff9ca89881bb8d030ecd019b84697a39e7b187bc57938
      Successfully built pycallgraph
      Installing collected packages: pycallgraph
      Successfully installed pycallgraph-1.0.1
      

      dot -v指令驗證一下graphviz是否安裝成功:

      [dechin@dechin-manjaro callgraph]$ dot -v
      bash: dot:未找到命令
      

      咦?明明參考的正確方法,graphviz咋沒有裝上呢?經過面向谷歌的編程技術,發現了原來在系統上需要先安裝一個graphviz,這里展示的是Manjaro Linux平臺的安裝方法:

      [dechin-manjaro callgraph]# pacman -S graphviz
      正在解析依賴關系...
      正在查找軟件包沖突...
      
      軟件包 (3) gts-0.7.6.121130-2  netpbm-10.73.33-1  graphviz-2.44.1-6
      
      下載大小:   9.74 MiB
      全部安裝大小:  24.73 MiB
      
      :: 進行安裝嗎? [Y/n] Y
      :: 正在獲取軟件包......
       netpbm-10.73.33-1-x86_64           1867.1 KiB  6.51 MiB/s 00:00 [####################################] 100%
       gts-0.7.6.121130-2-x86_64           211.0 KiB  12.1 MiB/s 00:00 [####################################] 100%
      錯誤:無法從 mirrors.ustc.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      錯誤:無法從 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      錯誤:無法從 mirrors.huaweicloud.com : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      錯誤:無法從 mirrors.sjtug.sjtu.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      錯誤:無法從 mirrors.tuna.tsinghua.edu.cn : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      錯誤:無法從 mirrors.aliyun.com : The requested URL returned error: 404 獲取文件 'graphviz-2.44.1-6-x86_64.pkg.tar.zst'
      警告:無法獲取某些文件
      錯誤:無法提交處理 (無法獲取某些文件)
      發生錯誤,沒有軟件包被更新。
      

      咦?再一次遇到了問題,配置了這么多鏡像源咋都安裝不上?再經過一番面向谷歌的編程,發現更新一下源就可以用了:

      [dechin-manjaro callgraph]# pacman -Syy
      :: 正在同步軟件包數據庫...
       core                                165.3 KiB  1968 KiB/s 00:00 [####################################] 100%
       extra                              1987.0 KiB  9.11 MiB/s 00:00 [####################################] 100%
       community                             6.6 MiB  9.93 MiB/s 00:01 [####################################] 100%
       multilib                            181.4 KiB  12.7 MiB/s 00:00 [####################################] 100%
       archlinuxcn                        1596.1 KiB  1232 KiB/s 00:01 [####################################] 100%
      

      再次嘗試安裝graphviz:

      [dechin-manjaro callgraph]# pacman -S graphviz
      :: Some packages should be upgraded first...
      正在解析依賴關系...
      正在查找軟件包沖突...
      
      軟件包 (2) archlinux-keyring-20210110-1  manjaro-system-20210217-1
      
      下載大小:  0.95 MiB
      全部安裝大小:  1.31 MiB
      凈更新大小:  0.02 MiB
      
      :: 進行安裝嗎? [Y/n] Y
      :: 正在獲取軟件包......
       archlinux-keyring-20210110-1-any    950.2 KiB  4.96 MiB/s 00:00 [####################################] 100%
       manjaro-system-20210217-1-any        21.4 KiB  0.00   B/s 00:00 [####################################] 100%
      (2/2) 正在檢查密鑰環里的密鑰                                     [####################################] 100%
      (2/2) 正在檢查軟件包完整性                                       [####################################] 100%
      (2/2) 正在加載軟件包文件                                         [####################################] 100%
      (2/2) 正在檢查文件沖突                                           [####################################] 100%
      (2/2) 正在檢查可用存儲空間                                       [####################################] 100%
      :: 正在處理軟件包的變化...
      (1/2) 正在更新 archlinux-keyring                                 [####################################] 100%
      ==> 正在從 archlinux.gpg 添加密匙...
      gpg: 公鑰 CF66D153D884358F 在其簽名之后的 16 秒生成
      ==> 正在本地簽名密匙環中的可信密匙...
        -> 正在本地簽名密匙 AB19265E5D7D20687D303246BA1DFB64FFF979E7...
        -> 正在本地簽名密匙 DDB867B92AA789C165EEFA799B729B06A680C281...
        -> 正在本地簽名密匙 0E8B644079F599DFC1DDC3973348882F6AC6A4C2...
        -> 正在本地簽名密匙 D8AFDDA07A5B6EDFA7D8CCDAD6D055F927843F1C...
        -> 正在本地簽名密匙 91FFE0700E80619CEB73235CA88E23E377514E00...
      ==> 正在導入擁有者信任值...
      ==> 正在密匙環中禁用已激活密匙...
        -> 正在禁用密匙 4A8B17E20B88ACA61860009B5CED81B7C2E5C0D2...
        -> 正在禁用密匙 684148BB25B49E986A4944C55184252D824B18E8...
        -> 正在禁用密匙 5357F3B111688D88C1D88119FCF2CB179205AC90...
        -> 正在禁用密匙 50F33E2E5B0C3D900424ABE89BDCF497A4BBCC7F...
        -> 正在禁用密匙 39F880E50E49A4D11341E8F939E4F17F295AFBF4...
        -> 正在禁用密匙 F5A361A3A13554B85E57DDDAAF7EF7873CFD4BB6...
        -> 正在禁用密匙 40440DC037C05620984379A6761FAD69BA06C6A9...
        -> 正在禁用密匙 FB871F0131FEA4FB5A9192B4C8880A6406361833...
        -> 正在禁用密匙 487EACC08557AD082088DABA1EB2638FF56C0C53...
        -> 正在禁用密匙 76B4192E902C0A52642C63C273B8ED52F1D357C1...
        -> 正在禁用密匙 40776A5221EF5AD468A4906D42A1DB15EC133BAD...
        -> 正在禁用密匙 0B20CA1931F5DA3A70D0F8D2EA6836E1AB441196...
        -> 正在禁用密匙 07DFD3A0BC213FA12EDC217559B3122E2FA915EC...
        -> 正在禁用密匙 34C5D94FE7E7913E86DC427E7FB1A3800C84C0A5...
        -> 正在禁用密匙 B1F2C889CB2CCB2ADA36D963097D629E437520BD...
        -> 正在禁用密匙 D4DE5ABDE2A7287644EAC7E36D1A9E70E19DAA50...
        -> 正在禁用密匙 44D4A033AC140143927397D47EFD567D4C7EA887...
        -> 正在禁用密匙 8F76BEEA0289F9E1D3E229C05F946DED983D4366...
        -> 正在禁用密匙 27FFC4769E19F096D41D9265A04F9397CDFD6BB0...
        -> 正在禁用密匙 4FCF887689C41B09506BE8D5F3E1D5C5D30DB0AD...
        -> 正在禁用密匙 5A2257D19FF7E1E0E415968CE62F853100F0D0F0...
        -> 正在禁用密匙 7FA647CD89891DEDC060287BB9113D1ED21E1A55...
        -> 正在禁用密匙 5E7585ADFF106BFFBBA319DC654B877A0864983E...
        -> 正在禁用密匙 E7210A59715F6940CF9A4E36A001876699AD6E84...
        -> 正在禁用密匙 5559BC1A32B8F76B3FCCD9555FA5E5544F010D48...
        -> 正在禁用密匙 BFA1ECFEF1524EE4099CDE971F0CD4921ECAA030...
        -> 正在禁用密匙 4D913AECD81726D9A6C74F0ADA6426DD215B37AD...
        -> 正在禁用密匙 8840BD07FC24CB7CE394A07CCF7037A4F27FB7DA...
        -> 正在禁用密匙 BC1FBE4D2826A0B51E47ED62E2539214C6C11350...
        -> 正在禁用密匙 9515D8A8EAB88E49BB65EDBCE6B456CAF15447D5...
        -> 正在禁用密匙 779CD2942629B7FA04AB8F172E89012331361F01...
        -> 正在禁用密匙 D921CABED130A5690EF1896E81AF739EC0711BF1...
        -> 正在禁用密匙 5696C003B0854206450C8E5BE613C09CB4440678...
        -> 正在禁用密匙 8CF934E339CAD8ABF342E822E711306E3C4F88BC...
        -> 正在禁用密匙 1A60DC44245D06FEF90623D6EEEEE2EEEE2EEEEE...
        -> 正在禁用密匙 81D7F8241DB38BC759C80FCE3A726C6170E80477...
        -> 正在禁用密匙 63F395DE2D6398BBE458F281F2DBB4931985A992...
        -> 正在禁用密匙 65EEFE022108E2B708CBFCF7F9E712E59AF5F22A...
        -> 正在禁用密匙 66BD74A036D522F51DD70A3C7F2A16726521E06D...
      ==> 正在更新可信數據庫...
      gpg: 下次信任度數據庫檢查將于 2021-03-06 進行
      (2/2) 正在更新 manjaro-system                                    [####################################] 100%
      :: 正在運行事務后鉤子函數...
      (1/1) Arming ConditionNeedsUpdate...
      
      正在解析依賴關系...
      正在查找軟件包沖突...
      
      軟件包 (3) gts-0.7.6.121130-2  netpbm-10.73.33-1  graphviz-2.46.0-1
      
      下載大小:   6.80 MiB
      全部安裝大小:  23.32 MiB
      
      :: 進行安裝嗎? [Y/n] Y
      :: 正在獲取軟件包......
       graphviz-2.46.0-1-x86_64              6.8 MiB  7.03 MiB/s 00:01 [####################################] 100%
      (3/3) 正在檢查密鑰環里的密鑰                                     [####################################] 100%
      (3/3) 正在檢查軟件包完整性                                       [####################################] 100%
      (3/3) 正在加載軟件包文件                                         [####################################] 100%
      (3/3) 正在檢查文件沖突                                           [####################################] 100%
      (3/3) 正在檢查可用存儲空間                                       [####################################] 100%
      :: 正在處理軟件包的變化...
      (1/3) 正在安裝 netpbm                                            [####################################] 100%
      (2/3) 正在安裝 gts                                               [####################################] 100%
      (3/3) 正在安裝 graphviz                                          [####################################] 100%
      graphviz 的可選依賴
          mono: sharp bindings
          guile: guile bindings
          lua: lua bindings
          ocaml: ocaml bindings
          perl: perl bindings [已安裝]
          python: python bindings [已安裝]
          r: r bindings
          tcl: tcl bindings [已安裝]
          qt5-base: gvedit [已安裝]
          gtk2: gtk output plugin [已安裝]
          xterm: vimdot
      :: 正在運行事務后鉤子函數...
      (1/2) Arming ConditionNeedsUpdate...
      (2/2) Warn about old perl modules
      

      Finally還是給我安裝成功了,接下來再看看dot指令的執行情況:

      [dechin-manjaro callgraph]# dot -v
      dot - graphviz version 2.46.0 (0)
      libdir = "/usr/lib/graphviz"
      Activated plugin library: libgvplugin_dot_layout.so.6
      Using layout: dot:dot_layout
      Activated plugin library: libgvplugin_core.so.6
      Using render: dot:core
      Using device: dot:dot:core
      The plugin configuration file:
              /usr/lib/graphviz/config6
                      was successfully loaded.
          render      :  cairo dot dot_json fig gd json json0 map mp pic pov ps svg tk visio vml vrml xdot xdot_json
          layout      :  circo dot fdp neato nop nop1 nop2 osage patchwork sfdp twopi
          textlayout  :  textlayout
          device      :  bmp canon cmap cmapx cmapx_np dot dot_json eps fig gd gd2 gif gtk gv ico imap imap_np ismap jpe jpeg jpg json json0 mp pdf pic plain plain-ext png pov ps ps2 svg svgz tif tiff tk vdx vml vmlz vrml wbmp webp x11 xdot xdot1.2 xdot1.4 xdot_json xlib
          loadimage   :  (lib) bmp eps gd gd2 gif ico jpe jpeg jpg png ps svg webp xbm
      

      運行示例

      這里我們以上一篇博客量子計算模擬器生成隨機數中的案例,來測試一下pycallgraph的功能。源代碼可以參考源博客地址,這里我們直接展示下更改后的代碼:

      # random_number.py
      from projectq import MainEngine
      from projectq.ops import H, Measure
      from pycallgraph import PyCallGraph
      from pycallgraph.output import GraphvizOutput
      
      def random_number_generator():
          eng = MainEngine()
          qubit = eng.allocate_qubit()
          H | qubit
          eng.flush()
          Measure | qubit
          random_number = int(qubit)
          eng.flush(deallocate_qubits=True)
          return random_number
      
      if __name__ == '__main__':
          graphviz = GraphvizOutput()
          graphviz.output_file = 'random_number_generator.png'
          with PyCallGraph(output=graphviz):
              random_number = random_number_generator()
              print('Random number generated by quantum simulator is:\
                      {}'.format(random_number))
      

      其實pycallgraph的使用方法也非常的簡單,只需要導入PyCallGraphGraphvizOutput兩個模塊,然后把main函數中所有需要運行的正常流程的代碼,放到with PyCallGraph(output=graphviz)里面即可。接下來運行該文件:

      [dechin@dechin-manjaro callgraph]$ python3 random_number.py 
      Random number generated by quantum simulator is:                0
      

      除了打印輸出,我們會發現在當前目錄下生成了一個名為random_number_generator.png的圖形文件,具體內容打開如下圖所示:

      補充示例

      考慮到上面的運行示例結果比較龐大,這也是一個稍微大一些的軟件項目所面臨的重大困難。這里為了簡明的展示pycallgraph的功能,我們再額外補充一個簡單的示例:

      # simple_calculation.py
      from pycallgraph import PyCallGraph
      from pycallgraph.output import GraphvizOutput
      
      def multiply(a, b):
          return a*b
      
      def plus(a, b):
          return a+b
      
      if __name__ == '__main__':
          graphviz = GraphvizOutput()
          graphviz.output_file = 'simple_calculation.png'
          with PyCallGraph(output=graphviz):
              a = 10
              b = 2
              print ('The value of a*b+b is: {}'.format(plus(multiply(a, b), b)))
      

      這個案例的功能,僅僅是把加法和乘法進行了函數的封裝,再在main函數中調用,執行結果和pycallgraph生成的圖片如下圖所示:

      [dechin@dechin-manjaro callgraph]$ python3 simple_calculation.py 
      The value of a*b+b is: 22
      


      在這個示例中,我們就可以很清晰的看到這個執行的文件的調用關系,其實就只是調用了multiplyplus兩個函數而已。

      總結概要

      使用pycallgraph這個工具,可以幫助我們更好的入手去分析一個全新的軟件包。通過了解各個模塊之間的調用關系,我們還可以比較直觀的梳理出相關的架構圖,帶著架構的思維去逐層的分析相應的軟件及其實現的方式。

      版權聲明

      本文首發鏈接為:http://www.jsfhjj.com/dechinphy/p/pycallgraph.html
      作者ID:DechinPhy
      更多原著文章請參考:http://www.jsfhjj.com/dechinphy/

      posted @ 2021-03-01 18:42  陸言君  閱讀(150)  評論(0編輯  收藏
      最新chease0ldman老人|无码亚洲人妻下载|大香蕉在线看好吊妞视频这里有精品www|亚洲色情综合网

        <sub id="gqw76"><listing id="gqw76"></listing></sub>
        <sub id="gqw76"><listing id="gqw76"></listing></sub>

      1. <form id="gqw76"><legend id="gqw76"></legend></form>