您輸入無效YAML,因爲你可以輕鬆檢查,例如here 您應該首先展開{% %}
構造,然後處理YAML,或者您應該使您的文件變爲有效的YAML。
這是選擇jinja2的部分結果,其中宏序列{% ... %}
以在YAML中具有特殊含義的字符({
)開頭。
如果您需要更改YAML並重新寫出,您可以定義自己的分隔符並選擇它們,以便在YAML中沒有特殊含義。
{% %}
您應該放置在YAML註釋塊中,因爲頂層的映射只有鍵值對。實現這一目標的一種方法是將開始重新定義爲#% %#
(您不一定必須更改結尾,但我更喜歡對稱)。
然後更新後,通過一個處理該文件的小腳本運行正確的YAML,並將定界符替換爲jinja2理解或調整環境的定界符,以更改jinja2使用的實際定義。
糾正data.yaml
:
import jinja2
from ruamel import yaml
yaml_file = 'data.yaml'
tmp_file = 'tmp.yaml'
data = yaml.round_trip_load(open(yaml_file))
data['package']['version'] = '<{ version }>'
with open(tmp_file, 'w') as fp:
yaml.round_trip_dump(data, fp)
environment = jinja2.Environment(
loader=jinja2.FileSystemLoader(searchpath='.'),
trim_blocks=True,
block_start_string='#%', block_end_string='%#',
variable_start_string='<{', variable_end_string='}>')
print(environment.get_template(tmp_file).render())
給:
package:
name: abawaca
version: 1.00
source:
fn: abawaca-1.00.tar.gz
url: https://github.com/CK7/abawaca/archive/v1.00.tar.gz
sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529
build:
number: 0
requirements:
build:
- gcc # [not osx]
- llvm # [osx]
請注意,你必須使用`ruamel.yaml(免責聲明
#% set name = "abawaca" %#
#% set version = "1.00" %#
package:
name: <{ name }>
version: 42
source:
fn: <{ name }>-<{ version }>.tar.gz
url: https://github.com/CK7/abawaca/archive/v<{ version }>.tar.gz
sha256: 57465bb291c3a9af93605ffb11d704324079036205e5ac279601c9e98c467529
build:
number: 0
requirements:
build:
- gcc # [not osx]
- llvm # [osx]
這可以通過處理:我是這個包的作者),你不能像PyYAML那樣簡單地做到這一點,因爲它拋棄了comm讀取YAML文件時讀取數據。由於評論中的所有jinja2都出現在文件的開頭,因此您可以通過此特定示例解決此問題,但通常情況並非如此。
我已經用一個完整的工作示例更新了我的答案。對不起,花了這麼長時間纔回到這裏。 – Anthon