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

前言

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

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

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

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

自动生成python程序调用关系逻辑图_第1张图片

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

自动生成python程序调用关系逻辑图_第2张图片

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

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

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

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

1、安装pycallgraph

pip install pycallgraph

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

降级下载setuptools命令

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

自动生成python程序调用关系逻辑图_第3张图片

linux下载

#方法1
sudo apt install graphviz
#方法2
sudo yum install graphviz
#方法3
sudo apt install graphviz
#方法4
sudo yum install graphviz

mac下载

#方法1
sudo port install graphviz
#方法2
brew install graphviz

3、windows安装详细流程

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

自动生成python程序调用关系逻辑图_第4张图片

2、点击我接受

自动生成python程序调用关系逻辑图_第5张图片

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

自动生成python程序调用关系逻辑图_第6张图片

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

自动生成python程序调用关系逻辑图_第7张图片

5、点击安装

自动生成python程序调用关系逻辑图_第8张图片

4、验证

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

自动生成python程序调用关系逻辑图_第9张图片

5、使用

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

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

from pycallgraph import PyCallGraph
from pycallgraph.output import GraphvizOutput

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

官方完整演示代码:

#!/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的图片,内容如下:

自动生成python程序调用关系逻辑图_第10张图片

6、实践

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

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

代码如下:

### 绘制流程图
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()

流程图如下:

自动生成python程序调用关系逻辑图_第11张图片

你可能感兴趣的:(python高级,python,开发语言)