ruamel.yaml==0.15.37(Python3.6.2)导出纯YAML失败问题
解决ruamel.yaml导出"纯"YAML报错的问题
嘿,我来帮你搞定这个导出报错的问题!你遇到的「无法导出为"纯"YAML」错误,主要是因为ruamel.yaml默认的YAML实例是为了保留注释、原格式而设计的,再加上你的代码里contexts部分没写完(数据结构不完整),才触发了这个问题。结合你的环境(ruamel.yaml==0.15.37、Python3.6.2),给你两个关键的解决步骤:
1. 补全完整的Kubernetes配置结构
你之前的代码里kube_context['context...没写完,Kubernetes的config文件需要完整的上下文关联,不然数据结构缺失会导致导出异常。先把这部分补全:
# 添加上下文,关联集群和用户 kube_context['contexts'].append({ 'name': 'test-context', 'context': { 'cluster': 'test', 'user': 'test/test' } }) # 设置当前激活的上下文 kube_context['current-context'] = 'test-context'
2. 调整ruamel.yaml的输出配置
ruamel.yaml默认的缩进格式和Kubernetes的规范不太一致,而且默认实例的一些设置可能会影响纯YAML导出。给YAML实例设置符合K8s的缩进规则,然后用正确的方法导出:
完整可运行代码
from ruamel.yaml import YAML import sys # 初始化YAML实例 yaml = YAML() # 设置Kubernetes标准的缩进格式:映射2空格,序列4空格,偏移2空格 yaml.indent(mapping=2, sequence=4, offset=2) # 加载初始K8s配置 kube_context = yaml.load(''' apiVersion: v1 clusters: [] contexts: [] current-context: '' kind: Config preferences: {} users: [] ''') # 添加用户配置 kube_context['users'].append({'name': 'test/test', 'user': {'token': 'test'}}) # 添加集群配置 kube_context['clusters'].append({'name': 'test', 'cluster': {'server': 'URL:443'}}) # 添加上下文配置(补全你之前缺失的部分) kube_context['contexts'].append({ 'name': 'test-context', 'context': { 'cluster': 'test', 'user': 'test/test' } }) # 设置当前上下文 kube_context['current-context'] = 'test-context' # 导出到标准输出(如果要存文件,把sys.stdout换成open('kubeconfig.yaml', 'w')即可) yaml.dump(kube_context, sys.stdout)
额外注意事项
- 如果你需要导出到文件,记得用文件对象代替
sys.stdout,比如:with open('updated_kubeconfig.yaml', 'w') as f: yaml.dump(kube_context, f) - ruamel.yaml 0.15.x版本的API和后续2.x版本有差异,不要混用不同版本的配置方法
- 避免在修改配置时混用普通Python列表/字典和ruamel的
CommentedSeq/CommentedMap对象(不过你当前的append操作是没问题的)
内容的提问来源于stack exchange,提问作者Will Gordon
相关产品推荐
相关产品推荐

