自动生成python程序调用关系逻辑图

前言

你是否因为看一个程序或者运行一个框架,不知道他的运行流程?

自己想写一个运行流程却觉得麻烦无从下手?

graphviz+pycallgraph帮你绘制让领导看了都拍桌子称赞你的python程序逻辑调用关系图!

先来看一下我这段时间在写的一个框架的部分流程吧~

密密麻麻,真的哈人,完整的更哈人。

狗看了都摇头,这都啥玩意?

用完之后,我的感受就是,不是太复杂的程序逻辑,用它整理确实方便不少。

逻辑很复杂的,你就老老实实地debug吧。

感兴趣的就继续看下去如何使用吧~

1、安装pycallgraph

shell 复制代码
pip install pycallgraph

如果安装这个报错,显示了一个什么setup的,就是你setuptools这个库比较新,需要降级一下才能下载。(因为这个库是2013年的,距今十年了,作者真牛皮!)

降级下载setuptools命令

shell 复制代码
pip install  setuptools==57.5.0

再次安装就可以了

2、下载graphviz

下载graphviz

下载地址:https://www.graphviz.org/download/

我使用的是windows,这个支持很多个平台,linux、mac都能用。

windows挑最新的下载就行,别的系统看官网里面可以直接命令行下载。

https://gitlab.com/api/v4/projects/4207231/packages/generic/graphviz-releases/8.1.0/windows_10_cmake_Release_graphviz-install-8.1.0-win64.exe

linux下载

bash 复制代码
#方法1
sudo apt install graphviz
bash 复制代码
#方法2
sudo yum install graphviz
bash 复制代码
#方法3
sudo apt install graphviz
bash 复制代码
#方法4
sudo yum install graphviz

mac下载

bash 复制代码
#方法1
sudo port install graphviz
bash 复制代码
#方法2
brew install graphviz

3、windows安装详细流程

1、双击下载好的exe文件,点击下一步

2、点击我接受

3、勾选第二个或者第三个,第二个的意思是给所有用户添加环境变量,第三个的意思是给当前用户添加到环境变量。我勾选的是第二个。勾选完毕点击下一步

4、安装目录使用默认,或者自己更改。我使用的是默认目录,点击下一步

5、点击安装

4、验证

控制台输入dot -v,出现如下内容代表安装成功且配置好了环境变量。

5、使用

这里使用的是官方的例子,并且我在本地成功运行了。

如下代码是标准使用,将code_to_profile()这个函数替换为你自己的执行入口函数即可。

python 复制代码
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

with PyCallGraph(output=GraphvizOutput()):
    code_to_profile()

官方完整演示代码:

python 复制代码
#!/usr/bin/env python
'''
This example demonstrates a simple use of 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()
    graphviz.output_file = 'basic1.png'

    with PyCallGraph(output=graphviz):
        person = Person()
        for a in range(10):
            person.add_banana(Banana())
        person.eat_bananas()
if __name__ == '__main__':
    main()

运行后,会在根目录生成一个basic1.png的图片,内容如下:

6、实践

官方的不是很直观,我写一段很简单的代码,大家看一下就能理解了。

每个分支上还标注了被调用的次数,执行时间,类、方法、属性

代码如下:

python 复制代码
### 绘制流程图
from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

class Demo():
    def __init__(self,name,gender,age):
        self.name = name
        self.age = age
        self.gender = gender

    def what_name(self):
        return self.name

    def what_gender(self):
        return self.gender

    def what_age(self):
        return self.age

    def who(self):
        name = self.what_name()
        gender = self.what_gender()
        age = self.what_age()


def main():
    graphviz = GraphvizOutput()
    graphviz.output_file = 'basicdemo.png'

    with PyCallGraph(output=graphviz):
        aa= Demo("小仔","男","18")
        aa.who()

if __name__ == '__main__':
    main()

流程图如下:

相关推荐
blammmp26 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧38 分钟前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵44 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
WaaTong1 小时前
Java反射
java·开发语言·反射
Troc_wangpeng1 小时前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的1 小时前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ1 小时前
C#语言:从入门到精通
开发语言·c#
云空1 小时前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
童先生1 小时前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu1 小时前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法