在 python 中使用 yaml 渲染时遇到问题(多行字符串)

问题描述 投票:0回答:1

这是我的 python 函数,我用它来渲染带有任何变量的 yaml 模板。 它工作正常,直到我将多行字符串传递到示例文件。

def render_template(template_path, context):
    """
    Render Jinja2 template using the provided context.
    """
    with open(template_path, 'r') as template_file:
        template = Template(template_file.read())
        return template.render(context)

这是我调用上述函数的地方

        if centralized_data is not None:
            print("centralized_data is not None")

            rendered_template = render_template(input_template_path, context)
            sample_data = yaml.safe_load(rendered_template)

            # Ensure both sample_data and centralized_data are dictionaries
            if isinstance(sample_data, dict) and isinstance(centralized_data, dict):
                final_data = merge_data(sample_data, centralized_data)
            else:
                print("Error: Either sample_data or centralized_data is not a dictionary")
                # Handle the error condition appropriately
                final_data = {}
        else:
            print("centralized_data is None, using sample_data directly")
            with open(input_template_path, 'r') as template_file:
                sample_data = yaml.safe_load(template_file)
            final_data = sample_data

我认为问题发生在

sample_data = yaml.safe_load(rendered_template)

这是我的多弦进行抛掷的地方,看起来像这样

输入

deployment:
  annotations:
    proxy.istio.io/config: |
      concurrency: 1
      concurr222ency: 1
      concurrenc33y: 1
      f: 3

和输出

deployment:
  annotations:
    proxy.istio.io/config: 'concurrency: 1

      concurr222ency: 1

      concurrenc33y: 1

      f: 3

      '

我也尝试过类似的东西,但没有帮助

proxy.istio.io/config: |>
proxy.istio.io/config: >-
python python-3.x yaml
1个回答
0
投票

您似乎正在使用 PyYAML,而且它不仅不是真正为进行这种往返而构建的 YAML,正如您所经历的。它还仅支持 YAML 1.1 的一个子集,该子集已于 2009 年过时。

我建议使用

ruamel.yaml
(免责声明:我是该包的作者):

import sys
from pathlib import Path

import ruamel.yaml

template_path = Path('template.yaml')
    
yaml = ruamel.yaml.YAML()
# yaml.preserve_quotes = True  # by default superfluous quotes are stripped
data = yaml.load(template_path)
yaml.dump(data, sys.stdout)

给出:

deployment:
  annotations:
    proxy.istio.io/config: |
      concurrency: 1
      concurr222ency: 1
      concurrenc33y: 1
      f: 3

如您所见,文字样式标量(

|
之后的三行)按原样保留。

如果您在加载后加载它,那么该文字样式标量也包含有效的 YAML “模板”, 您可以重新插入该转储,但需要小心以免丢失字面标量样式。

您的输入对我来说看起来不像 Jinja2 模板,它们通常有

{{
}}
。也因为那些你平时 无法加载 Jinja2 模板 使用 YAML 解析器,因为 Jinja2 构造会使模板无效。
ruamel.yaml
有一个插件, 特别是对于那些将模板转换为有效的 YAML 的人,以便您可以更新 部分,然后将其转换回 Jinja2。之后你可以渲染它并 将渲染的文本加载为有效的 YAML(另请参阅 this这个答案)

© www.soinside.com 2019 - 2024. All rights reserved.