Python脚本更新YAML文件后无变更,无法提交至远程仓库
问题分析与解决方案
核心排查与修复点
异常信息无法正常输出
你的异常打印语句存在语法错误,无法显示真实报错详情(比如文件找不到、加载失败、写入权限不足等):print("error when touching the YAML file: {e}")需改为格式化字符串才能正确输出错误:
print(f"error when touching the YAML file: {e}")文件路径可能不匹配
脚本运行的工作目录如果不是build.yml所在目录,会加载不存在的文件,yaml.safe_load返回None,后续更新逻辑会直接跳过,最后写入的空文件不在Git跟踪范围内,导致提交无变更。- 解决:使用绝对路径指定文件:
import os yaml_file_path = os.path.join(os.path.dirname(__file__), "build.yml")
- 解决:使用绝对路径指定文件:
键名存在不匹配情况
检查原build.yml中的键名是否和update_values完全一致(包括大小写、空格、引号)。比如原文件是Key1而脚本里是key1,会导致if key in data判断不成立,跳过更新。值未发生实际变化
如果update_values中的值和原文件对应键的值完全相同,即使执行更新,文件内容也不会变化,Git检测不到变更。可以在更新前后打印数据对比:print("原始数据:", data) for key, value in update_values.items(): if key in data: data[key] = value print("更新后数据:", data)
修复后的完整代码示例
import yaml import os yaml_file_path = os.path.join(os.path.dirname(__file__), "build.yml") try: with open(yaml_file_path, 'r') as file: data = yaml.safe_load(file) # 处理空文件或加载失败的情况 if data is None: print("警告:YAML文件为空或加载失败") data = {} update_values = { 'key1': 'q700mb', 'key2': 'xyz', } print("原始数据:", data) for key, value in update_values.items(): if key in data: print(f"更新键 {key}: {data[key]} -> {value}") data[key] = value else: print(f"键 {key} 不存在于YAML文件中") print("更新后数据:", data) with open(yaml_file_path, 'w') as file: # 保留原文件键顺序,避免不必要的格式变更 yaml.dump(data, file, default_flow_style=False, sort_keys=False) except Exception as e: print(f"error when touching the YAML file: {e}")
额外注意事项
- 添加
sort_keys=False可以避免yaml.dump自动排序键,防止因键顺序变化导致Git误判为文件变更。 - 运行脚本后,手动查看
build.yml内容确认更新生效,再执行Git暂存和提交操作。
内容的提问来源于stack exchange,提问作者c0d3rbox
相关产品推荐
相关产品推荐

