2017-02-07 43 views
1

我希望能夠在Python中讀取YAML神社配置文件,就像使用PyYAML庫,但我收到的錯誤:YAML和Jinja2的讀者

{% set name = "abawaca" %} 
{% set version = "1.00" %} 

package: 
    name: {{ name }} 
    version: {{ version }} 

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] 
+1

我已經用一個完整的工作示例更新了我的答案。對不起,花了這麼長時間纔回到這裏。 – Anthon

回答

1

您輸入無效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都出現在文件的開頭,因此您可以通過此特定示例解決此問題,但通常情況並非如此。

+0

謝謝@anthon,但你知道如何以編程方式展開yaml並用yaml讀取結果。 – ypriverol

+0

您可以通過閱讀jinja2來擴展構造,獲得一個文件並使用解析器讀取該文件。 – Anthon

+0

你有一個例子(片段代碼)我之前嘗試過,並沒有工作。 – ypriverol