You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible循环中复用Matplotlib生成的PDF表格并修改?

解决方案:Ansible循环复用Matplotlib表格对象而非读取PDF

你当前的问题核心是:PDF是静态图像格式,无法从中恢复Matplotlib的Table或Figure对象,直接读取PDF修改表格的思路不可行。正确的做法是在首次生成时保存Matplotlib的绘图状态(Figure和Table对象),后续迭代加载这个状态进行修改。


1. 修改Python脚本,用pickle保存/加载绘图状态

替换原脚本,通过pickle序列化保存绘图对象,后续直接复用已有表格:

# -*- coding: utf-8 -*-
import sys
import matplotlib.pyplot as plt
import pickle
import os

# 定义保存绘图状态的文件路径
PICKLE_FILE = "table_state.pkl"

val1 = ["ABC", "DEC", "IFG", "HTI", "CBF", "JSF", "FHYU", "FJu", "JSF", "JSF", "JSF", "JSF", "SMQ1", "SMQ2", "JSF", "JSF", "SMU", "PYTHON", "JAVA", "TDS", "JFSF", "F", "HUN", "R"]
val2 = ["ROOM", "OIT", "", "", "", "", "", "", "", "", "", "","", "", "", "", "", "", "", "", "", "", "", ""]
val3 = [["" for c in range(24)] for r in range(24)] 

def create_table():
    fig, ax = plt.subplots() 
    ax.set_axis_off() 
    table = ax.table( 
        cellText=val3,  
        rowLabels=val2,  
        colLabels=val1, 
        rowColours=["palegreen"] * 24,  
        colColours=["palegreen"] * 24, 
        cellColours=[["grey"] * 24] * 24,
        cellLoc='center',  
        loc='upper left') 
    ax.set_title('TBAL', fontweight="bold") 
    # 保存fig和table到pickle文件
    with open(PICKLE_FILE, 'wb') as f:
        pickle.dump((fig, table), f)
    return fig, table

def load_table():
    # 从pickle文件加载已有的fig和table
    with open(PICKLE_FILE, 'rb') as f:
        fig, table = pickle.load(f)
    return fig, table

def color_table(table, color, number_cell):
    number_cell = int(number_cell)
    table[(number_cell, 14)].set_facecolor(color)

def pdf_conversion(fig):   
    # 使用传入的fig保存,避免依赖全局plt状态
    fig.savefig('test.pdf')
    # 后台执行时建议注释掉该行,避免阻塞
    # plt.show()

def main(color, number_cell, creation_of_table):
    if creation_of_table.lower() == "true":
        # 首次创建表格并保存状态
        fig, table = create_table()
    else:
        # 加载已保存的表格状态
        if not os.path.exists(PICKLE_FILE):
            raise FileNotFoundError(f"状态文件{PICKLE_FILE}不存在,请确保首次迭代已执行")
        fig, table = load_table()

    color_table(table, color, number_cell)
    pdf_conversion(fig)

if __name__ == '__main__':
    color = sys.argv[1]
    number_cell = sys.argv[2]
    creation_of_table = sys.argv[3]
    main(color, number_cell, creation_of_table)

2. 调整Ansible任务

确保循环中正确传递creation_of_table参数,且受控节点上的table_state.pkl文件在迭代间保留:

- name: 执行表格生成/修改脚本
  ansible.builtin.command: python3.6 script.py "{{ color }}" "{{ number_cell }}" "{{ creation_of_table }}"
  loop: "{{ your_loop_items }}"
  vars:
    # 根据循环索引判断是否为首次迭代
    creation_of_table: "{{ 'True' if loop.index0 == 0 else 'False' }}"
    # 示例参数,根据实际需求替换
    color: "{{ item.color }}"
    number_cell: "{{ item.cell_number }}"

关键注意事项

  • 版本兼容性:确保所有迭代使用的Python和Matplotlib版本一致,避免pickle序列化/反序列化失败。
  • 文件权限:确保Ansible执行用户对脚本所在目录有读写权限。
  • 资源清理:所有迭代完成后,可添加任务删除table_state.pkl临时文件。

内容的提问来源于stack exchange,提问作者user12304an

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:10:42