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的subprocess模块总结
Nov 07 Python
在Python中使用swapCase()方法转换大小写的教程
May 20 Python
以视频爬取实例讲解Python爬虫神器Beautiful Soup用法
Jan 20 Python
使用Python对SQLite数据库操作
Apr 06 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
PyCharm使用之配置SSH Interpreter的方法步骤
Dec 26 Python
基于Python正确读取资源文件
Sep 14 Python
详解KMP算法以及python如何实现
Sep 18 Python
Python列表嵌套常见坑点及解决方案
Sep 30 Python
Python模拟键盘输入自动登录TGP
Nov 27 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生成随机密码的三种方法小结
2010/09/04 PHP
php header函数的常用http头设置
2015/06/25 PHP
初识通用数据库操作类――前端easyui-datagrid,form(php)
2015/07/31 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
jQuery实现用方向键控制层的上下左右移动
2013/01/13 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
JQuery调用WebServices的方法和4个实例
2014/05/06 Javascript
jquery实现textarea输入框限制字数的方法
2015/01/15 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
对称加密与非对称加密优缺点详解
2017/02/06 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
webpack打包非模块化js的方法
2018/10/24 Javascript
JavaScript变量作用域及内存问题实例分析
2019/06/10 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
2019/06/18 Javascript
vue+ESLint 配置保存 自动格式化代码
2020/03/17 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
Vue组件为什么data必须是一个函数
2020/06/11 Javascript
js实现无缝轮播图插件封装
2020/07/31 Javascript
python自动zip压缩目录的方法
2015/06/28 Python
python简单文本处理的方法
2015/07/10 Python
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
PyQt5实现拖放功能
2018/04/25 Python
Pycharm设置界面全黑的方法
2018/05/23 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
Armor Lux法国官方网站:水手服装、成衣和内衣
2020/05/26 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
面试通知单大全
2015/04/20 职场文书
初中思想品德教学反思
2016/02/24 职场文书
靠谱准确的求职信
2019/04/02 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书