g++ 安装python_Python中动态与静态 Call Graph(调用关系图)分析工具

8a505b2c5671a49b2a1b00b16d51dc24.png

说明:本文中介绍的分析工具只适用于分析Python3的程序运行过程。

Call Graph 简介

Call Graph 是一种流程控制图,目的是表格目标程序的各个子过程之间的相互调用关系。图中的每个节点代表一个子过程,每个从 f 到 g 的边记录了子过程 f 对子过程 g 的调用。

调用图可以是动态的或静态的。动态调用图是程序执行的记录,因此,动态调用图尽管是准确的,但仅描述了该程序的一次运行。而静态调用图则旨在展示程序的所有可能的调用过程。确切的静态调用图是一个无法NP问题,因此静态调用图的产生算法通常只能是以overapproximations的方式去近似。也就是说,在图中表示的一些调用关系,可能在实际的运行过程中根本不会发生。

在不同语言和场景中有不同的Call Graph 分析工具,详情参考这里。在本文中我们将会介绍适用于python代码分析的动态调用图分析工具 pycallgraph和静态调用图分析工具 pyan。前者远比后者有名,但是我们确实两个都需要。而且后者因为不需要运行程序就能直接对程序进行分析,所以更加快速便捷。

下面我们使用 pycallgraph 给出的python程序例子作为我们的分析材料:

class 

动态调用图分析

pycallgraph 的安装可以直接参考其Github上的安装说明。需要注意的是(它的说明也提到了),这个库本身可以直接通过pip安装,但是它还需要使用graphviz用来进行结果的可视化。而graphviz在windows下需要手动安装并配置系统变量。

成功安装之后,可以使用命令行命令和python程序内调用两种方法,详情见pycallgraph官方入门文档。

d5ef253601cffbae8804d8ea52b46ff3.png
pycallgraph动态调用分析

静态调用图分析

因为pyan的资料较少,而且安装更加复杂,所以这里详细说明。

1、首先使用git+pip进行安装。

pip install git+https://github.com/ttylec/pyan

如果没有安装git的话,也可以手动从该网址 下载安装包,然后解压并切换到解压目录,然后运行 python setup.py install 。

2、安装完成后,将pyan作为模块运行,并将结果存储在dot文件中。

我个人的方法是先在Ipython环境中切换到需要分析的python程序的目录,然后运行下面的代码:

!

这样就能将当前目录下所有Python文件(对应命令中的*.py)进行分析,并将结果导出到 myuses.dot 文件中。dot是一种通用的是图形描述语言,其文件后缀就是dot。很多工具都能对其进行渲染以及修改。

注意可以使用 python -m pyan --help 查看 pyan 的各个选项:

Options

比如发现所有的函数基本都在一个文件中定义的话,就可以省略输出中的定义位置的显示。也就是在选项中不再选择 -a 或者 --annotated 。

3、对dot文件进行读取或者转换后读取

像是前面提到的 graphviz 就全面支持对dot文件的各种操作,你可以直接使用以下命令将dot文件转换成svg文件方便查看,或者您也可以在graphviz中渲染该dot文件并展示,也可以选择其他软件来读取并展示该dot文件。

!

作者更推荐的方式是使用VSCode中的 Graphviz (dot) language support 插件,该插件能够直接对dot文件进行可视化,方便快捷。

1be22b373dd64bf9fa4f72612496c9d9.png
pyan静态调用分析产生dot文件并使用VSCode插件对dot文件进行读取展示

然后在贡献一个自己的实际使用时候的分析结果吧(来自自己的实际小项目),代码写的很垃圾,所以过段时间直接看程序自己就看不懂了,所以需要用可视化的方法重新分析一下,发现真的帮大忙了(另外自己以后也会注意写出更加规范的程序)。

e24cd18219a57991e8021f062503b82e.png

前面讲得更适合分析有很多py文件的python大工程(尤其适合用于探索一个不太熟悉的python库),如果是刚入门的同学的话,可能更需要一个对自己小程序中的数据进行可视化的话,推荐看看下面这个文章。

机器之心:实时可视化Debug:VS Code 开源新工具,一键解析代码结构​zhuanlan.zhihu.com
bcfb3619c920dfb4edd9a96081a0a147.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值