如何通过单Python脚本批量生成多个PlantUML图?
批量生成PlantUML/Graphviz图的Python脚本方案
嘿,这事儿好办!我之前也遇到过需要批量更新一堆PlantUML图的情况,手动敲命令确实麻烦。下面给你一个简单的Python脚本,一次性搞定所有文件的生成,不用重复执行命令。
先确认前提
首先你得确保已经装好了plantuml Python包,还有Java环境(PlantUML底层依赖Java):
pip install plantuml
运行java -version能正常输出版本信息就说明Java没问题。
批量处理脚本代码
直接用这个脚本就行,我给你加了注释,一看就懂:
import os import subprocess def batch_generate_plantuml(input_dir, output_dir=None): # 自动创建输出目录,默认在输入目录下建个output文件夹 if not output_dir: output_dir = os.path.join(input_dir, "generated_diagrams") os.makedirs(output_dir, exist_ok=True) # 遍历输入目录下的所有txt文件(你可以改成.puml/.plantuml这类标准后缀) for filename in os.listdir(input_dir): if filename.endswith(".txt"): full_path = os.path.join(input_dir, filename) # 构建plantuml命令,指定输出目录 command = [ "python", "-m", "plantuml", "-o", output_dir, full_path ] try: # 执行命令,check=True会在命令失败时抛出异常 subprocess.run(command, check=True, capture_output=True, text=True) print(f"✅ 成功生成: {filename} -> {os.path.basename(output_dir)}") except subprocess.CalledProcessError as e: print(f"❌ 处理{filename}失败,错误信息: {e.stderr}") if __name__ == "__main__": # 这里替换成你的PlantUML文件所在的目录,比如你的两个示例文件都放在这里 target_directory = "./uml_files" # 如果你想指定输出目录,就加第二个参数,比如: batch_generate_plantuml(target_directory, "./my_output") batch_generate_plantuml(target_directory)
怎么用你的示例文件?
- 把
example_flow.txt和Graphviz_example.txt放到./uml_files目录(或者修改脚本里的target_directory为你的文件实际路径) - 运行脚本,生成的PNG图会自动放到
./uml_files/generated_diagrams文件夹里
可选优化:更灵活的用法
如果想让脚本更通用,可以加个命令行参数功能,这样不用每次改代码:
import argparse # 上面的batch_generate_plantuml函数不变 if __name__ == "__main__": parser = argparse.ArgumentParser(description="批量生成PlantUML/Graphviz图") parser.add_argument("input_dir", help="存放PlantUML文件的目录") parser.add_argument("-o", "--output_dir", help="输出目录,默认在输入目录下的generated_diagrams文件夹") args = parser.parse_args() batch_generate_plantuml(args.input_dir, args.output_dir)
现在你可以这样运行:
python batch_uml.py ./uml_files -o ./my_custom_output
额外小技巧
- 如果想生成SVG格式的图,就在命令里加
-tsvg参数,把command改成:command = [ "python", "-m", "plantuml", "-tsvg", "-o", output_dir, full_path ] - 要是只想处理特定文件名的文件,比如只处理带
_example的,把if filename.endswith(".txt")改成if "_example" in filename and filename.endswith(".txt")就行
内容的提问来源于stack exchange,提问作者a.t.
相关产品推荐
相关产品推荐

