使用pycallgraph分析python代码函数调用流程以及框架
技术背景
在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等。但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块。只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能。这里我们就引入一个工具pycallgraph
,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数、类的关系图,让我们一起来了解下这个工具的安装和使用方法。
Manjaro平台安装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的使用方法也非常的简单,只需要导入PyCallGraph
和GraphvizOutput
两个模块,然后把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
这个工具,可以帮助我们更好的入手去分析一个全新的软件包。通过了解各个模块之间的调用关系,我们还可以比较直观的梳理出相关的架构图,带着架构的思维去逐层的分析相应的软件及其实现的方式。
版权声明
本文首发链接为:https://www.cnblogs.com/dechinphy/p/pycallgraph.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
使用pycallgraph分析python代码函数调用流程以及框架的更多相关文章
- Python 控制流代码混淆简介,加大别人分析你代码逻辑和流程难度
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 王平 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- 使用SonarQube+Eclipse来分析python代码
背景 最近在项目中推广集成测试的理念以及相关工具,在jenkins中集成sonar去分析项目的java代码的时候,意外的发现,sonarqube上还有对应python的插件,而自己写的测试工具大部分都 ...
- 利用graphviz软件和pycallgraph库自动生成Python代码函数调用关系图
参考博文:https://blog.csdn.net/qq_36408085/article/details/82952846 https://blog.csdn.net/fondax/article ...
- [转] Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- Python代码性能优化技巧
摘要:代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Python代码,看完一定会让你 ...
- Python 代码性能优化技巧(转)
原文:Python 代码性能优化技巧 Python 代码优化常见技巧 代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构.优化. ...
- Python 代码性能优化技巧
选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 performance 较差的机器上,因此有必要进行一定的代码优化 ...
- 如何使用 Pylint 来规范 Python 代码风格
如何使用 Pylint 来规范 Python 代码风格 转载自https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/ Pylint 是什么 ...
- python 代码检测工具
对于我这种习惯了 Java 这种编译型语言,在使用 Python 这种动态语言的时候,发现错误经常只能在执行的时候发现,总感觉有点不放心. 而且有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导 ...
随机推荐
- unix环境高级编程第四章笔记
文件和目录 start fstart lstart函数 一旦给出pathname, start函数就返回了与此命名文件有关的信息结构 #include <sys/start> int st ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) E. Let Them Slide(数据结构+差分)
题意:问你有n个长度总和为n的数组 你可以移动数组 但不能移出长度为w的矩形框 问你每一列的最大值是多少? 思路:只有一次询问 我们可以考虑差分来解决 然后对于每一行数组 我们可以用数据结构维护一下 ...
- windows10上下载远程控制软件之后导致windows10亮度调节功能不能使用
出现了通用即插即用监视器就可以了
- hdu 6795 Little W and Contest 并查集+排列组合
题意: t组输入,有n个人,刚开始谁也不认识谁.每一个人有一个权值w[i](1<=w[i]<=2),你要挑选3个互相不认识的人组成一个队,且要保证3个人权值之和大于等于5(也就意味着最少要 ...
- VMX - block by NMI和 NMI unblockinig due to IRET 之间的关系
相关SDM章节: 27.2.3- Information About NMI Unblocking Due to IRET 最近收到同事发来的一个问题,即: VMCS 中的 Guest Interru ...
- CF1478-B. Nezzar and Lucky Number
CF1478-B. Nezzar and Lucky Number 题意: 题目给出一个数字\(d(1\leq d \leq 9)\)代表某个人最喜欢的数字. 题目定义了幸运数字,它的含义为:若一个数 ...
- Gym 101464C - 计算几何+二分(uva1463)
不是很难,但是我觉得对代码能力的要求还是挺高的. 注意模块化. 因为是浮点数,所以二分用的很多很多. 参考 https://blog.csdn.net/njupt_lyy/article/detail ...
- certbot 获取数字证书失效问题
title: certbot 获取数字证书失效问题 author: Narule date: 2021-02-18 10:45:00 +0800 categories: [Technology^技术, ...
- UMD 模块 vs CJS 模块
UMD 模块 vs CJS 模块 使用方式 UMD, window 全局注册后,直接使用 <!DOCTYPE html> <html lang="zh-Hans" ...
- rrweb 用户操作录制和还原
rrweb 用户操作录制和还原 demos https://www.rrweb.io/replay refs https://www.rrweb.io/ xgqfrms 2012-2020 www.c ...