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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
Python中有趣在__call__函数
Jun 21 Python
Python科学计算之NumPy入门教程
Jan 15 Python
numpy使用fromstring创建矩阵的实例
Jun 15 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
Python日志无延迟实时写入的示例
Jul 11 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python实现http接口自动化测试的示例代码
Oct 09 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原生模板引擎 最简单的模板引擎
2012/04/25 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
2019/12/18 PHP
基于jquery的loading效果实现代码
2010/11/05 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JavaScript获取浏览器信息的方法
2015/11/20 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
JavaScript实现页面跳转的方式汇总
2016/05/16 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
详解package.json版本号规则
2019/08/01 Javascript
解决vue 子组件修改父组件传来的props值报错问题
2019/11/09 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
Chrome插件开发系列一:弹窗终结者开发实战
2020/10/02 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python实现图片添加文字
2019/11/26 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python模拟FTP文件服务器的操作方法
2020/02/18 Python
如何实现在jupyter notebook中播放视频(不停地展示图片)
2020/04/23 Python
H5页面适配iPhoneX(就是那么简单)
2019/12/02 HTML / CSS
比利时的在线灯具店:Lampen24.be
2019/07/01 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
英语道歉信范文
2014/01/09 职场文书
境外导游求职信
2014/02/27 职场文书
大一新生学期自我评价
2014/04/09 职场文书
餐饮投资计划书
2014/04/25 职场文书
绿色环保标语
2014/06/12 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
入党培养人考察意见
2015/06/08 职场文书
小学英语听课心得体会
2016/01/14 职场文书
pytorch中的model.eval()和BN层的使用
2021/05/22 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
go goth封装第三方认证库示例详解
2022/08/14 Golang