【Python】jinja2を使ってtemplateを読み込みたい


はじめに

<バージョン>
python: 3.7.9

 以下のような、jinja2テンプレートとymlを組み合わせるにはどうすればいいでしょうか?
参考記事(1つ目)のように、ymlを引数としてpythonに渡すコードは見つかったのですが、
pythonコードの中で完結しているものがなかったので作ってみました。

test.j2
var1: {{ var1 }}
var2: {{ var2 }}
test.yml
---
var1: test1
var2: test2

1. サンプルコード

 コードにあるように「with open」を使えば、ymlを引数としてpythonに渡す必要が
無くなるようです。

template.py
#!/usr/bin/env python3
# coding: utf-8
import sys, yaml, jinja2

# define variable
base_dir = '/home/ec2-user/test'
j2_dir   = base_dir + '/j2'
yml_dir  = base_dir + '/yml'

# import j2 template
_loader      = jinja2.FileSystemLoader(j2_dir, encoding='utf-8')
_environment = jinja2.Environment(loader=_loader)
_template    = _environment.get_template("test.j2")

# import yaml and render
with open(yml_dir + '/' + 'test.yml') as import_yml:
  sys.stdout.write(_template.render(yaml.load(import_yml)))

2. ディレクトリ構成

 ファイルは以下の構成にしてください。

.
├── template.py
├── j2
│   └── test.j2
└── yml
    └── test.yml

3. 実行結果

 想定通り、jinja2を使ってymlとtemplateを組み合わせることが出来ました。

出力
[ec2-user@ip-<ip-addr> test]$ python template.py
var1: test1
var2: test2

参考資料

PythonでYAMLを読み込んでJinja2で整形する
【PyYAML VS ruamel.yaml】PythonからYAMLファイルを触ってみた