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 相关文章推荐
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
Python 网页解析HTMLParse的实例详解
Aug 10 Python
Python用for循环实现九九乘法表
May 31 Python
python3.7.0的安装步骤
Aug 27 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
解决python3 安装不了PIL的问题
Aug 16 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Django框架教程之中间件MiddleWare浅析
Dec 29 Python
Tensorflow分批量读取数据教程
Feb 07 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 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页面缓存方法小结
2015/01/10 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
JavaScript实现动态增加文件域表单
2009/02/12 Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
javascript常用的方法整理
2015/08/20 Javascript
AngularJS 购物车全选/取消全选功能的实现方法
2017/08/14 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
python的Template使用指南
2014/09/11 Python
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
pandas数据框,统计某列数据对应的个数方法
2018/04/11 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
十岁生日父母答谢词
2014/01/18 职场文书
旅游专业毕业生自荐书
2014/06/30 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
消防演习通知
2015/04/25 职场文书
Django cookie和session的应用场景及如何使用
2021/04/29 Python
深入理解redis中multi与pipeline
2021/06/02 Redis
MySQL实现配置主从复制项目实践
2022/03/31 MySQL
Python可视化动图组件ipyvizzu绘制惊艳的可视化动图
2022/04/21 Python
python使用pycharm安装pyqt5以及相关配置
2022/04/22 Python