如何在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
相关产品推荐
相关产品推荐

