2010-05-18 68 views
1

我想使用python将一组模板翻译成基于从主配置文件中取得的值的一组配置文件。但是,我有一些问题。考虑下面的模板文件示例。python中的模板文件评估

file1.cfg.template

%(CLIENT1)s %(HOST1)s %(PORT1)d C %(COMPID1)s 
%(CLIENT2)s %(HOST2)s %(PORT2)d C %(COMPID2)s 

此文件包含为每个客户端的条目。有数百个这样的配置文件,我不想为每种类型的配置文件都有逻辑。 Python应该执行替换并自动生成配置文件,给出从主XML文件读取的一组全局值。但是,在上面的例子中,如果CLIENT2不存在,我该如何删除该行?我认为Python会使用像这样生成的配置文件:

os.open("file1.cfg.template").read() % myhash 

其中myhash是从,不包含在CLIENT 2所有主要配置文件配置参数的散列。如果它不包含CLIENT2,我希望该行从文件中消失。是否可以在文件中插入一些'IF'块并让python评估它?

感谢您的帮助。任何建议最受欢迎。

+0

如果任何人都可以在Python或第三方框架中给出一个例子如何实现这个确切的行为,那将是太棒了。 – user236215 2010-05-18 22:42:57

回答

3

听起来像你可能已经超出了你最初的简单的本土模板解决方案。也许你应该移动到像Jinja?简单地实施第三方解决方案可能比创建/继续维护自己的解决方案更令人头疼。

其他选项:

+0

我发现人们从我自己的答案链接中可以得到很多关于Jinja的好消息。你个人推荐使用其他模板语言吗?感谢您给我们提供帮助。 – 2010-05-18 22:53:41

0

也许你可以使用一个独立的Django的模板。

How do I use Django templates without the rest of Django? - Stack Overflow

+0

你能举个例子吗?我怎样才能用Django实现上述行为?那就是在文件中使用模板代码,读取它,评估它,用IF块忽略第二行。 – user236215 2010-05-18 22:40:06

+0

您可以在第4章中找到示例:Django模板系统 http://www.djangobook.com/zh/beta/chapter04/。检查{%if%}标记。 – 2010-05-18 22:50:02

0

鉴于该文件已经存在,我会的东西设置默认值一样CLIENT2(假设你事先知道所有可能的密钥)。您可以将默认值可能设置为不寻常的东西,所以你可以做

config = os.open("file1.cfg.template").read() % myhash 
config = [l for l in config.split('\n') if <l does not have unusual text>].join('\n') 

我与其他人在长期的一个更强大的模板会更好同意。

+0

如果字符串中不存在模板变量,如果它们不出现在myhash中,是否有方法可用于默认模板变量?否则,设置默认设置将非常困难。 – user236215 2010-05-18 22:38:51

+0

我找到了一个解决方案。我将分别评估每条线和异常处理。谢谢。 – user236215 2010-05-18 22:57:21