使用graphviz+pycallgraph绘制python调用关系图

2023-05-16

绘制python代码调用关系图

  • 前言
    • 1. 工具安装
    • 1.1 安装graphviz
    • 1.2 安装pycallgraph
    • 2.可视化调用关系
  • 参考文献

前言

一个 python project 中往往包含很多 .py 文件。python文件中又会包含很多函数,函数之间相互传参和调用。如果遇到代码行数很多的情况,我们阅读起来就会有困难。那么有什么办法可以解决这个困难呢?
我们可以考虑采取可视化的方法将代码调用关系用图的方法表示出来。 pycallgraph是一种适用于python代码的动态调用分析工具。当然要想实现可视化还需要安装graphviz。graphviz 是一个图形可视化工具,可以将调用关系表示为图的形式。

1. 工具安装

我们需要首先安装Graphviz,再安装 pycallgraph,否则就会报错。这是由于pycallgraph依赖于dot命令,要想使用 dot 就需要先安装 graphviz。

1.1 安装graphviz

首先给出 graphviz 的官网链接:http://www.graphviz.org/download/
下面给出两种安装方法,推荐使用第一种。
在这里插入图片描述
方法1:进入graphviz官网后,点击 Windows 就自动跳转到 Windows 安装包
在这里插入图片描述
可以根据自己系统的情况选择 win32.exe 或 win64.exe 进行下载。下载好之后进行安装即可。注意:在 install options 界面时记得勾选添加环境变量
如果忘记勾选也不要紧,可以手动设置环境变量,在 path 中添加 graphviz 安装位置下的 bin 路径。例如:C:\Program Files\Graphviz\bin。

方法2:使用Choco命令进行下载
Chocolatey 是一种软件包管理器,只用一行命令就可以实现程序安装。Chocolatey 自身的安装也很方便。使用以管理员身份运行 cmd , 输入以下内容并回车,就可以安装完成。

@"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -InputFormat None -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
  1. 首先使用 choco info graphviz 查看要安装程序的信息。
    发现有可以安装的 graphviz 包
    在这里插入图片描述
  2. 使用 choco install --yes graphviz 安装 graphviz
    其中 --yes 意味着对 Chocolatey 安装过程的认可,如果不加,Chocolatey 会在安装的每一个步骤前停下来问你是否同意继续。
  3. 安装好后可以使用 choco list --local 查看用 Chocolatey 装了哪些程序
    在这里插入图片描述
    如图所示 graphviz 已经安装好了。
  4. 如果想要卸载 graphviz 可以使用 choco uninstall graphviz 命令。

1.2 安装pycallgraph

还是首先给出 pycallgraph 的官网链接https://pycallgraph.readthedocs.io/en/master/
如果你有多个python环境,请注意在合适的python环境中安装 pycallgraph。
安装命令为:pip install pycallgraph
我在 pytorch 环境下安装了 pycallgraph。如果只有一个python环境,直接 Win + R 使用 cmd 安装即可,命令也是 pip install pycallgraph
在这里插入图片描述

2.可视化调用关系

目前为止,我们已经安装好了所需的工具。下面使用工具可视化 python 函数调用关系。下面给出一个官网的示例。

#!/usr/bin/env python
'''
This example demonstrates a simple use of pycallgraph.
'''
#导入pycallgraph相关包
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

# 函数主体
class Banana:

    def eat(self):
        pass


class Person:

    def __init__(self):
        self.no_bananas()

    def no_bananas(self):
        self.bananas = []

    def add_banana(self, banana):
        self.bananas.append(banana)

    def eat_bananas(self):
        [banana.eat() for banana in self.bananas]
        self.no_bananas()


def main():
    graphviz = GraphvizOutput() # 语句1
    # 语句2:在当前目录生成名为 basic.png 的调用关系图
    graphviz.output_file = 'basic.png'

    with PyCallGraph(output=graphviz):	
    #语句3:通过 pycallgraph 可以查看执行下面代码时函数间的调用关系
        person = Person()
        for a in xrange(10):
            person.add_banana(Banana())
        person.eat_bananas()


if __name__ == '__main__':
    main()

运行结果如下图所示
在这里插入图片描述

参考文献

  1. pygraphviz安装教程(亲测成功)
  2. 像程序员一样安装程序:Chocolatey 初见
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用graphviz+pycallgraph绘制python调用关系图 的相关文章

随机推荐

  • 三角形最小路径和(JS)--自底向上解决(动态规划)

    题目描述 xff1a 给定一个三角形 xff0c 找出自顶向下的最小路径和 每一步只能移动到下一行中相邻的结点上 例如 xff0c 给定三角形 xff1a 2 3 4 6 5 7 4 1 8 3 自顶向下的最小路径和为 11 xff08 即
  • leetcode42--接雨水(JS)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图 xff0c 计算按此排列的柱子 xff0c 下雨之后能接多少雨水 上面是由数组 0 1 0 2 1 0 1 3 2 1 2 1 表示的高度图 xff0c 在这种情况下 xff0c 可以
  • 自定义组件继承的组件基类React.Component是什么

    我们平时写React组件时都要继承一个父类 xff0c 那就是React Component 也会用到props state和setState xff0c 我们只是会使用它 xff0c 然而不知道它们怎么来的 xff0c 既要知其然也要知其
  • Java 在二维坐标系绘制矩形、圆形、多边形

    最近遇到一个需求 xff0c 大概要求是 xff1a 根据前端传递的参数 xff0c 在Java侧绘制虚拟的二维封闭图形 xff0c 判断各个图形间是否有交集 在java awt包下有个名为Shape的接口 xff0c 可以实现在二维坐标系
  • Uncaught (in promise) TypeError: Cannot read property 'data' of undefined

    最近在学习Redux的时 xff0c 自己写了个Demo xff0c 用fetch异步调用接口时返回这个脑壳疼的问题 问题 xff1a 问题排查 xff1a 一步一步在控制台打印 xff0c 并检测类型 xff0c 发现控制台打印undef
  • Ajax、fetch、axios的区别与优缺点

    背景 前端的技术发展速度非常的快 xff0c 异步请求也是其重要的体现之一 xff0c 从最早的原生XHR xff0c 再到JqueryAjax的统治时代 xff0c 再到近来 xff0c fetch axios等技术也开始出现并大量投入使
  • 什么是 Promise.allSettled() !新手老手都要会?

    什么是 Promise allSettled xff01 新手老手都要会 xff1f Promise allSettled 方法返回一个在所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise x
  • 一份稳进Shopee的简历长啥样?

    小伙伴们好 xff0c 我是Eason 简历是求职流程的第一步 xff0c 是很关键的一环 Eason在做Shopee招聘工作时 xff0c 收到了投递的1000 43 的简历 xff0c 简历也修改过50多次 xff0c 最近也帮10多个
  • Vue项目中较优雅地封装Echarts

    场景 1 Echarts 1 使用时 xff0c 都需要写一堆的 option xff0c 如果每个图表都要写一个 xff0c 一个文件里面的代码量是很大的 2 不方便复用 需求 1 方便复用 2 展示类的图表 xff0c 数据与业务 样式
  • React系列--JSX到底是什么东西

    JSX 简介 JSX的全称是 Javascript and XML xff0c React发明了JSX xff0c 它是一种可以在JS中编写XML的语言 JSX更像一种模板 xff0c 类似于Vue中的 template 为什么使用JSX
  • https请求+basic认证

    目录 1 工具类 SSLClient 2 工具类HttpsClientUtil 3 使用 1 工具类 SSLClient 此类可绕过https证书 import org apache http conn ClientConnectionMa
  • 自旋锁的原理及使用

    什么是自旋锁 是指当一个线程在获取锁的时候 xff0c 如果锁已经被其它线程获取 xff0c 那么该线程将循环等待 xff0c 然后不断的判断锁是否能够被成功获取 xff0c 直到获取到锁才会退出循环 获取锁的线程一直处于活跃状态 xff0
  • 实验11 多线程

    1 设有一个银行账户 xff0c 里面有2000元钱 该账户归tom和jack两个人共同所有 每个人每 次可以取100元钱 编写一个类BankAccount表示银行账户 xff0c void withdraw int count 方法表 示
  • stm32 esp8266 ota升级-自建mqtt和文件服务器全量升级

    stm32 esp8266 ota系列文章 xff1a stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 o
  • rk1126开发板开发记录—SDK环境准备和系统烧录

    序言 最近在弄rk系列的开发板 xff0c 手上正好有一台rk1126的板子 xff0c 因为之前很少接触到嵌入式的东西 xff0c 所以在模型部署的同时遇到了很多坑 xff0c 在此期间也有很多收获 xff0c 习惯性的用文章记录一下开发
  • linux 应用层串口调试函数

    tcgetattr函数与tcsetattr函数 xff08 获取终端信息 xff09 波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成
  • 安装MySQl 8.0遇到的问题及解决方法

    一 官网下载最新版本mysql xff0c 安装完成后 xff0c 安装SQLyog 二 在 C Program Files MySQL MySQL Server 8 0目录中查找是否存在 my ini文件 xff0c 如不存在 xff0c
  • Cmakelists.txt添加.h和.cpp文件

    文件目录结构是这样 代码都是最基本的代码 仅仅是个小的demo cmakelists txt里面的内容 span class token comment cmake的版本要求 span cmake minimum required span
  • 【tcpdump命令使用总结】

    1 tcpdump说明 linux系统的tcpdump命令用来分析数据包分析工具 xff0c 相似的工具有wireshark等 xff0c wireshark使用见 wireshark报文解析ping baidu com 执行tcpdump
  • 使用graphviz+pycallgraph绘制python调用关系图

    绘制python代码调用关系图 前言1 工具安装1 1 安装graphviz1 2 安装pycallgraph2 可视化调用关系 参考文献 前言 一个 python project 中往往包含很多 py 文件 python文件中又会包含很多