python将xml格式文件转成png或者pdf格式

本文主要介绍运行NCCL代码时输出的xml文件该如何转成更加容易观看的图格式

如下是举例,服务器上的PCIE相关的topo xml 文件

bash 复制代码
<system version="1">
  <cpu numaid="1" affinity="ffffff00,0000ffff,ff000000" arch="x86_64" vendor="GenuineIntel" familyid="6" modelid="106">
    <pci busid="0000:98:00.0" class="0x060400" vendor="0x1bd4" device="0x3004" subsystem_vendor="0x0000" subsystem_device="0x0000" link_speed="16.0 GT/s PCIe" link_width="16">
      <pci busid="0000:a6:00.0" class="0x030200" vendor="0x10de" device="0x2235" subsystem_vendor="0x10de" subsystem_device="0x145a" link_speed="16.0 GT/s PCIe" link_width="16">
        <gpu dev="0" sm="86" rank="0" gdr="1"/>
      </pci>
      <pci busid="0000:a5:00.0" class="0x020000" vendor="0x15b3" device="0x1021" subsystem_vendor="0x15b3" subsystem_device="0x0023" link_speed="16.0 GT/s PCIe" link_width="16">
        <nic>
          <net name="mlx5_0" dev="0" speed="200000" port="1" latency="0.000000" guid="0xbe8cb30003ae6d94" maxconn="131072" gdr="1"/>
        </nic>
      </pci>
    </pci>
  </cpu>
</system>

将该文件转换成图格式

python 复制代码
import os
import sys
import logging
import argparse
import xml.etree.ElementTree as ET
from graphviz import Graph


def build_topology(graph, parent_element, parent_node=None):
    dev = parent_element.tag
    res = None
    if dev == 'cpu':
        res = parent_element.get('numaid').replace(':', '_')
    elif dev == 'pci':
        res = parent_element.get('busid').replace(':', '_')
    elif dev == 'gpu':
        res = parent_element.get('dev').replace(':', '_')
    elif dev == 'nvlink':
        res = parent_element.get('target').replace(':', '_')
    elif dev == 'net':
        res = parent_element.get('name').replace(':', '_')
    
    node = dev
    if res is not None:
        node = dev + '_' + res
    
    all_attributes = {attr: parent_element.get(attr) for attr in parent_element.attrib}
    str_attr = node + '\n\n' + str(all_attributes).replace(',', '\n')
    graph.node(node, shape='box', label=str_attr)
    
    if parent_node is not None:
        graph.edge(parent_node, node)
    
    for child_element in parent_element:
        build_topology(graph, child_element, node)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Parse xml file to pdf or png.')
    parser.add_argument('-i', '--input', required=True, help='Input file path')
    parser.add_argument('-o', '--output', default='xml', help='Output file name')
    args = parser.parse_args()

    input_file_path = args.input
    output_file_name = args.output


	# 解析XML数据
	tree = ET.parse(input_file_path)
	# 获取 XML 文档对象的根结点 Element
	root_element = tree.getroot()
	
	graph = Graph()
	build_topology(graph, root_element)
	
	# 绘制拓扑图
	graph.render(output_file_name, format='png')
	# graph.view()
	print('Finished')

得出结果为

相关推荐
小瑞瑞acd5 分钟前
【小瑞瑞精讲】卷积神经网络(CNN):从入门到精通,计算机如何“看”懂世界?
人工智能·python·深度学习·神经网络·机器学习
开开心心就好10 分钟前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
火车叼位24 分钟前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
火车叼位30 分钟前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
孤狼warrior41 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat996631 小时前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威1 小时前
农经权二轮延包—各种地块示意图
python·arcgis
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep1 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手1 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储