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

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

说明:本文中介绍的分析工具只适用于分析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官方入门文档。

g++ 安装python_Python中动态与静态 Call Graph(调用关系图)分析工具_第2张图片
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文件进行可视化,方便快捷。

g++ 安装python_Python中动态与静态 Call Graph(调用关系图)分析工具_第3张图片
pyan静态调用分析产生dot文件并使用VSCode插件对dot文件进行读取展示

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

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

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

机器之心:实时可视化Debug:VS Code 开源新工具,一键解析代码结构​zhuanlan.zhihu.com
g++ 安装python_Python中动态与静态 Call Graph(调用关系图)分析工具_第5张图片

你可能感兴趣的:(g++,安装python,python文件之间的相互调用,分析并写出下列程序的运行结果)