自动生成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()

流程图如下:

相关推荐
若亦_Royi9 分钟前
C++ 的大括号的用法合集
开发语言·c++
KevinRay_11 分钟前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
Captain823Jack42 分钟前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
资源补给站1 小时前
大恒相机开发(2)—Python软触发调用采集图像
开发语言·python·数码相机
Captain823Jack1 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
m0_748247551 小时前
Web 应用项目开发全流程解析与实战经验分享
开发语言·前端·php
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
PieroPc2 小时前
Python 自动化 打开网站 填表登陆 例子
运维·python·自动化
FF在路上2 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
VinciYan2 小时前
基于Jenkins+Docker的自动化部署实践——整合Git与Python脚本实现远程部署
python·ubuntu·docker·自动化·jenkins·.net·运维开发