防止使用buildout发生变量替换

时间:2009-07-16 03:45:55

标签: python buildout

是否有一种简单的方法可以在buildout配置中转义用于变量替换的魔术字符,这样就可以保留字符串。换句话说,我说:

[part]
attribute = ${variable}

我实际上并不希望它扩展$ {variable},而是将其保留为文字值。

实际上,我遇到的具体问题不在于buildout配置文件本身,而是在由配方'collective.recipe.template'处理的模板文件中。这使用配置文件中使用的buildout中的相同变量替换引擎。问题是我想用作模板的文件已经将'$ {variable}'语法与最终使用该文件的应用程序配置系统结合使用。

我找到解决问题的唯一方法是使用类似的东西:

[server-xml]
recipe = collective.recipe.template
input = templates/server.xml.in
output = ${product:build-directory}/conf/server.xml
dollar = $

在模板输入文件中,然后有:

${dollar}{variable}

而不是:

${variable}

已经有了。

这样做会导致使用模板对部分查找'dollar'属性并将其替换为'$'。

而不是必须这样做,有点希望能做到:

\${variable}

或者甚至是:

$${variable}

并且无需使用虚拟属性来欺骗它做我想要的事情。

查看buildout的源代码,它匹配变量替换的方式似乎不提供转义机制。

如果确实没有办法,那么也许有人知道可以进行变量扩展的另一个构建模板配方,但是它提供了一种逃避机制,无论它指示变量的方式,这样就可以避免出现问题。模板系统扩展机制与模板文件中的文字数据之间的冲突。

3 个答案:

答案 0 :(得分:5)

我担心你对buildout变量替换代码(collective.recipe.template所依赖的)的分析是正确的。没有语法可以转义${section:variable}变量替换,而您提供${dollar}替换的解决方案是我能想到的最佳解决方法。

您当然也可以向zc.buildout团队提出补丁,以添加对转义变量替换语法的支持。 : - )

答案 1 :(得分:5)

从collective.recipe.template版本1.7开始,您可以使用genshi文本模板,但是从版本1.8开始,它因为一些修复而变得有用。

recipe = collective.recipe.template[genshi]:genshi
...
mymessage = Hello

所以输入文件看起来像是

The message in $${:mymessage} is: ${options['mymessage']}

genshi允许逃避美元,请参阅http://genshi.edgewall.org/wiki/Documentation/templates.html#escaping

如何在http://pypi.python.org/pypi/collective.recipe.template#genshi-text-templates

使用genshi的配方的更多细节

答案 2 :(得分:2)

${之间插入空替换应该可以防止buildout将结果文本作为buildout替换进行评估。

<强> buildout.cfg:

[server-xml]
recipe = collective.recipe.template
input = server.xml.in
output = server.xml
_ =

<强> server.xml.in:

do no substitution $${_}{myvar} blah

<强> server.xml中:

do no substitution ${myvar} blah