来自内置过滤器的jinja2 basename或dirname?

719*_*016 10 jinja2 python-2.7

有没有办法只使用内置过滤器进行basenamedirname在jinja2?例如:

#!/usr/bin/python
import jinja2

mybin = '/my/favorite/full/path/foo'
t = jinja2.Template("my binary is {{ mybin }}")
print t.render()
t = jinja2.Template("my basename is {{ mybin|basename() }}")
print t.render()
t = jinja2.Template("my dirname is {{ mybin|dirname() }}")
print t.render()

1
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Ste*_* E. 31

如果您发现此问题并且正在使用Ansible,那么这些过滤器确实存在于Ansible中.

要获取文件路径的姓氏,例如'/etc/asdf/foo.txt'中的'foo.txt':

{{ path | basename }}
Run Code Online (Sandbox Code Playgroud)

要从路径获取目录:

{{ path | dirname }}
Run Code Online (Sandbox Code Playgroud)

如果没有Ansible,可以轻松地向Jinja2添加自定义过滤器:

def basename(path):
    return os.path.basename(path)

def dirname(path):
    return os.path.dirname(path)
Run Code Online (Sandbox Code Playgroud)

在渲染模板之前,通过更新环境中的过滤器字典,在模板环境中注册这些:

environment.filters['basename'] = basename
environment.filters['dirname']  = dirname
Run Code Online (Sandbox Code Playgroud)