Python使用graphviz画流程图过程解析


Posted in Python onMarch 31, 2020

问题描述

项目中需要用到流程图,如果用js的echarts处理,不同层级建动态计算位置比较复杂,考虑用python来实现

测试demo

实现效果如下

Python使用graphviz画流程图过程解析

完整代码

import yaml
import os
import ibm_db
from graphviz import Digraph
from datetime import datetime


# db连接
def db2_query(sql):
  conn = ibm_db.connect(
    "DATABASE=%s;HOSTNAME=%s;PORT=%s;PROTOCOL=TCPIP;UID=%s;PWD=%s" % (
      config['db2_databse'],
      config['db2_host'],
      config['db2_port'],
      config['db2_user'],
      config['db2_password']
    ), "", ""
  )

  if conn:
    # 执行
    stmt = ibm_db.exec_immediate(conn, sql)
    result = ibm_db.fetch_both(stmt)

  return result, stmt, conn


# 添加所有的点
def add_nodes():
  sql = "SELECT * FROM AML.DEP_OFTEN_TRAD WHERE ACCOUNT_NO=" + ACCOUNT_NO + " ORDER BY NUM DESC fetch first 10 rows ONLY;"
  result, stmt, conn = db2_query(sql)
  nodes = []
  nodes_dict = {}
  nodes_dict[ACCOUNT_NO] = 'A'

  count = 0
  while (result):
    count = count + 1
    print(chr(ord('A') + count) + "," + result[3])
    dot.node(chr(ord('A') + count), result[3], shape="rectangle", color="orange")

    nodes.append(result[2])
    nodes_dict[result[2]] = chr(ord('A') + count)
    print('-----------------')
    result = ibm_db.fetch_both(stmt)

  # 关闭数据库连接
  ibm_db.close(conn)
  nodes.append(ACCOUNT_NO)

  return dot, nodes, nodes_dict


# 添加所有的边
def add_edges(nodes):
  nodes_back = nodes
  print(nodes_back)

  for p in range(len(nodes_back)):
    nodes_temp = nodes.copy()
    from_nodes = nodes_temp.pop(p)
    print("len of nodes_temp:" + str(len(nodes_temp)) + ",from_nodes:" + from_nodes)

    nodes_temp_in = ",".join(nodes_temp)
    nodes_temp_in = '(' + nodes_temp_in + ')'

    sql = "SELECT * FROM AML.DEP_OFTEN_TRAD WHERE ACCOUNT_NO=" + from_nodes + " and CNTPRT_ACCOUNT_NO IN" + \
       nodes_temp_in
    result, stmt, conn = db2_query(sql)
    if (result):
      while (result):
        print('-----------------')
        print(result)
        print(result['CNTPRT_ACCOUNT_NO'] + nodes_dict[result['CNTPRT_ACCOUNT_NO']])
        print("add edges," + result['TRAD_VAL'] + " from:" + from_nodes + ",to:" + result['CNTPRT_ACCOUNT_NO'])
        dot.edge(nodes_dict[from_nodes], nodes_dict[result['CNTPRT_ACCOUNT_NO']], result['TRAD_VAL'])
        result = ibm_db.fetch_both(stmt)

      # 关闭数据库连接
      ibm_db.close(conn)
  return dot


if __name__ == "__main__":
  yaml_path = os.path.join('../', 'config.yaml')
  with open(yaml_path, 'r') as f:
    config = yaml.load(f)

  dot = Digraph(
    engine="circo",
    comment='The Test Table',
    format="png"
  )

  ACCOUNT_NO = '10100002181'
  # 添加圆点A,A的标签是Dot A
  dot.node('A', '中心客户', shape="rectangle", color="blue")

  nodes_begin = datetime.now()
  print(str(nodes_begin) + " nodes_begin")

  dot, nodes, nodes_dict = add_nodes()

  print(nodes_dict)
  edges_begin = datetime.now()
  print(str(edges_begin) + " edges_begin")

  dot = add_edges(nodes)

  print(dot.source)
  render_begin = datetime.now()
  print(str(render_begin) + " render_begin")
  dot.render('./file/db2-table.gv', view=True)

测试流程图

用不同的参数,生成的2个图如下Python使用graphviz画流程图过程解析

linux环境搭建

线上是不连外网的私有服务器,开始在离线环境安装,需要依赖的包太多,后来就在虚拟机里redhat6.6在线装好了。####redhat安装rpm依赖

#清除原有RHEL的YUM及相关软件包。
rpm -qa | grep yum | xargs rpm -e --nodeps
rpm -qa |grep python-urlgrabber|xargs rpm -e --nodeps

mv CentOS6-Base-163.repo /etc/yum.repos.d/

#安装rpm依赖包

rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm
rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
rpm -ivh yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm yum-3.2.29-81.el6.centos.noarch.rpm

替换yum163源

cd /etc/yum.repos.d/mv rhel-source.repo rhel-source.repo.bak

清理yum缓存

yum clean allyum makecache#测试yum repolist

安装graphviz

yum install 'graphviz*'#测试which dot #/usr/bin/dotdot -V#dot - graphviz version 2.26.0 (20091210.2329)

查看yum的安装日志,发现需要依赖2,30个包

解决依赖关系
--> 执行事务检查
---> Package graphviz.x86_64 0:2.26.0-10.el6 will be 安装
--> 处理依赖关系 libgd.so.2()(64bit),它被软件包 graphviz-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 libXpm.so.4()(64bit),它被软件包 graphviz-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 libXaw.so.7()(64bit),它被软件包 graphviz-2.26.0-10.el6.x86_64 需要
---> Package graphviz-devel.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-doc.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-gd.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-graphs.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-guile.x86_64 0:2.26.0-10.el6 will be 安装
--> 处理依赖关系 guile,它被软件包 graphviz-guile-2.26.0-10.el6.x86_64 需要
---> Package graphviz-java.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-lua.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-perl.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-php.x86_64 0:2.26.0-10.el6 will be 安装
--> 处理依赖关系 php(zend-abi) = 20090626,它被软件包 graphviz-php-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 php(api) = 20090626,它被软件包 graphviz-php-2.26.0-10.el6.x86_64 需要
---> Package graphviz-python.x86_64 0:2.26.0-10.el6 will be 安装
---> Package graphviz-ruby.x86_64 0:2.26.0-10.el6 will be 安装
--> 处理依赖关系 ruby,它被软件包 graphviz-ruby-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 libruby.so.1.8()(64bit),它被软件包 graphviz-ruby-2.26.0-10.el6.x86_64 需要
---> Package graphviz-tcl.x86_64 0:2.26.0-10.el6 will be 安装
--> 处理依赖关系 tcl >= 8.3,它被软件包 graphviz-tcl-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 tk,它被软件包 graphviz-tcl-2.26.0-10.el6.x86_64 需要
--> 处理依赖关系 libtk8.5.so()(64bit),它被软件包 graphviz-tcl-2.26.0-10.el6.x86_64 需要
--> 执行事务检查
---> Package gd.x86_64 0:2.0.35-11.el6 will be 安装
---> Package guile.x86_64 5:1.8.7-5.el6 will be 安装
---> Package libXaw.x86_64 0:1.0.11-2.el6 will be 安装
---> Package libXpm.x86_64 0:3.5.10-2.el6 will be 安装
---> Package php-common.x86_64 0:5.3.3-49.el6 will be 安装
---> Package ruby.x86_64 0:1.8.7.374-5.el6 will be 安装
---> Package ruby-libs.x86_64 0:1.8.7.374-5.el6 will be 安装
--> 处理依赖关系 libreadline.so.5()(64bit),它被软件包 ruby-libs-1.8.7.374-5.el6.x86_64 需要
---> Package tcl.x86_64 1:8.5.7-6.el6 will be 安装
---> Package tk.x86_64 1:8.5.7-5.el6 will be 安装
--> 执行事务检查
---> Package compat-readline5.x86_64 0:5.2-17.1.el6 will be 安装
--> 完成依赖关系计算

依赖关系解决

yum安装openssl-devel

#查看openssl安装包rpm -aq|grep opensslyum install openssl-devel -y

查看yum依赖

正在升级 : libcom_err-1.41.12-24.el6.x86_64 1/26
正在升级 : libselinux-2.0.94-7.el6.x86_64 2/26
正在升级 : krb5-libs-1.10.3-65.el6.x86_64 3/26
****************
Verifying : e2fsprogs-libs-1.41.12-21.el6.x86_64 23/26
Verifying : libselinux-2.0.94-5.8.el6.x86_64 24/26
Verifying : krb5-libs-1.10.3-33.el6.x86_64 25/26
Verifying : libss-1.41.12-21.el6.x86_64 26/26

python安装pip依赖

pip install -r requirement.txt

#Installing collected packages: PyYAML, ibm-db, tornado, graphviz
# Running setup.py install for PyYAML ... done
# Running setup.py install for ibm-db ... done
# Running setup.py install for tornado ... done
#Successfully installed PyYAML-5.1.1 graphviz-0.11.1 ibm-db-3.0.1 tornado-6.0.3 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python的Bottle框架中实现最基本的get和post的方法的教程
Apr 30 Python
python学习数据结构实例代码
May 11 Python
python爬虫入门教程--快速理解HTTP协议(一)
May 25 Python
Python实现KNN邻近算法
Jan 28 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
在Windows中设置Python环境变量的实例讲解
Apr 28 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
python实现简易数码时钟
Feb 19 Python
用python拟合等角螺线的实现示例
Dec 27 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
Jun 04 Python
如何利用Python动态模拟太阳系运转
Sep 04 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
Django模板之基本的 for 循环 和 List内容的显示方式
Mar 31 #Python
基于python实现计算且附带进度条代码实例
Mar 31 #Python
Django values()和value_list()的使用
Mar 31 #Python
利用python实现凯撒密码加解密功能
Mar 31 #Python
python手机号前7位归属地爬虫代码实例
Mar 31 #Python
django修改models重建数据库的操作
Mar 31 #Python
Python写捕鱼达人的游戏实现
Mar 31 #Python
You might like
给php新手谈谈我的学习心得
2007/02/25 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
2013/06/25 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
escape、encodeURI、encodeURIComponent等方法的区别比较
2006/12/27 Javascript
可以文本显示的公告栏的js代码
2007/03/11 Javascript
用JavaScript调用WebService的示例
2008/04/07 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
js 字符串转化成数字的代码
2011/06/29 Javascript
js中的this关键字详解
2013/09/25 Javascript
javascript检查浏览器是否已经启用XX功能
2015/07/10 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
layer.open回调获取弹出层参数的实现方法
2019/09/10 Javascript
JS实现简单随机3D骰子
2019/10/24 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
[00:31]2016完美“圣”典风云人物:国士无双宣传片
2016/12/04 DOTA
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
python爬取微信公众号文章
2018/08/31 Python
PyQt5 文本输入框自动补全QLineEdit的实现示例
2020/05/13 Python
Django中FilePathField字段的用法
2020/05/21 Python
Keras搭建自编码器操作
2020/07/03 Python
HTML5实时语音通话聊天MP3压缩传输3KB每秒
2019/08/28 HTML / CSS
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
安全生产活动月方案
2014/03/09 职场文书
万能检讨书2000字
2014/10/17 职场文书
鲁迅故里导游词
2015/02/05 职场文书
检讨书格式
2015/05/07 职场文书
因个人原因离职的辞职信范文
2015/05/12 职场文书
《蟋蟀的住宅》教学反思
2016/02/17 职场文书
CSS精灵图的原理与使用方法介绍
2022/03/17 HTML / CSS