前言
你是否因为看一个程序或者运行一个框架,不知道他的运行流程?
自己想写一个运行流程却觉得麻烦无从下手?
graphviz+pycallgraph帮你绘制让领导看了都拍桌子称赞你的python程序逻辑调用关系图!
先来看一下我这段时间在写的一个框架的部分流程吧~
密密麻麻,真的哈人,完整的更哈人。
狗看了都摇头,这都啥玩意?
用完之后,我的感受就是,不是太复杂的程序逻辑,用它整理确实方便不少。
逻辑很复杂的,你就老老实实地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
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文件,点击下一步
2、点击我接受
3、勾选第二个或者第三个,第二个的意思是给所有用户添加环境变量,第三个的意思是给当前用户添加到环境变量。我勾选的是第二个。勾选完毕点击下一步
4、安装目录使用默认,或者自己更改。我使用的是默认目录,点击下一步
5、点击安装
4、验证
控制台输入dot -v
,出现如下内容代表安装成功且配置好了环境变量。
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
的图片,内容如下:
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()
流程图如下: