这是我的 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: >-
您似乎正在使用 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
或这个答案)