Home > python > Using Jinja2 for formatting strings

Using Jinja2 for formatting strings

Example 1

from jinja2 import Environment

config = {
    'ffmpeg': '/opt/ffmpeg.static/ffmpeg',
    'bitrate': '600k',
    'width': '480',
    'height': '320',
    'threads': '2'

command = """{{ ffmpeg }} -i {input} -codec:v libx264 -quality good -cpu-used 0
-b:v {{ bitrate }} -profile:v baseline -level 30 -y -maxrate 2000k
-bufsize 2000k -vf scale={{ width }}:{{ height }} -threads {{ threads }} -codec:a libvo_aacenc
-b:a 128k {output}""".replace('\n', ' ')

command = Environment().from_string(command).render(config)

print command


/opt/ffmpeg.static/ffmpeg -i {input} -codec:v libx264 -quality good -cpu-used 0 -b:v 600k -profile:v baseline -level 30 -y -maxrate 2000k -bufsize 2000k -vf scale=480:320 -threads 2 -codec:a libvo_aacenc -b:a 128k {output}

Here, command is still a template that can be further formatted, e.g.

print command.format(input="movie.avi", output="movie.mp4")

Example 2

Now let’s see a simpler example:

from jinja2 import Environment

print Environment().from_string("Hello {{ name }}!").render(name="Laci")

Output: “Hello Laci!”.

More examples
See https://gist.github.com/warren-runk/1317933.

Update (20130301)
Here I show you how to avoid using jinja2 :) Let’s take the first example above where jinja2 formatting was combined with Python’s string formatting.

Actually, in this example, jinja2 may be an overkill. We can combine old-style formatting and new-style formatting to have the same result:

config = {
    'ffmpeg': '/opt/ffmpeg.static/ffmpeg',
    'bitrate': '600k',
    'width': '480',
    'height': '320',
    'threads': '2'

command = """{ffmpeg} -i %(input)s -codec:v libx264 -quality good -cpu-used 0
-b:v {bitrate} -profile:v baseline -level 30 -y -maxrate 2000k
-bufsize 2000k -vf scale={width}:{height} -threads {threads} -codec:a libvo_aacenc
-b:a 128k %(output)s""".replace('\n', ' ').format(**config)

Now we have a template that can be further formatted in a loop for instance:

print command % {'input': fname, 'output': output}

Thanks bulkan for the tip.

  1. October 12, 2014 at 18:20

    Hi. Thanks for this post.
    Wouldn’t you rather write :

    print command % {'input': 'fname', 'output': 'output'}

    instead of:

    print command % {'input': fname, 'output': output}

    (as neither fname nor output are defined as far as I can see)?

    • October 12, 2014 at 19:41

      In Example #1 they are defined and in Example #2 I was lazy to repeat them. So yes, you should define them. For instance:


      Then the line

      print command % {'input': fname, 'output': output}

      will work fine.

  2. October 12, 2014 at 20:43

    OK. Thanks. :)

  1. No trackbacks yet.

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: