从文件模板创建文件的zc.buildout方法

z3c.recipe.filetemplate的Python项目详细描述


基本用法

使用 z3c.recipe.filetemplate buildout recipe,您可以自动化 从模板生成文本文件。执行死刑后, 配方将读取多个模板文件,执行变量 替换并将结果写入相应的输出文件。

这个配方有几个特性,但它总是使用带有 。在 后缀中,处理模板,并将文件写入所需的 具有相同文件模式和相同名称但没有 的位置。 后缀. < /P>

例如,考虑这个文本文件的简单模板:

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)

现在让我们创建一个构建配置,以便我们可以替换 此文件中的值。我们要做的就是定义一个使用 z3c.recipe.filetemplate 配方。使用 文件 参数 我们指定一个或多个需要替换的文件(用 空白)。然后,我们可以向部分添加任意参数。 这些将用于填充模板中的变量:

< Buff行情>
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... parts = message
...
... [message]
... recipe = z3c.recipe.filetemplate
... files = helloworld.txt
... world = Philipp
... """)

在执行buildout之后,我们可以看到 ${world} 确实 替换为Philipp < Buff行情>

>>> print system(buildout)
Installing message.
>>> cat(sample_buildout, 'helloworld.txt')
Hello Philipp!

如果需要转义${…}模式,可以通过重复使用美元 符号。 < Buff行情>

>>> update_file(sample_buildout, 'helloworld.txt.in',
... """
... Hello world! The double $${dollar-sign} escapes!
... """)
>>> print system(buildout)
Uninstalling message.
Installing message.
>>> cat(sample_buildout, 'helloworld.txt')
Hello world! The double ${dollar-sign} escapes!

请注意,不带大括号的美元符号本身不会被解析。

< Buff行情>
>>> update_file(sample_buildout, 'helloworld.txt.in',
... """
... $Hello $$world! $$$profit!
... """)
>>> print system(buildout)
Uninstalling message.
Installing message.
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
0

注意,输出文件使用与输入文件相同的权限位 文件

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
1
源文件夹和全局文件

默认情况下,配方查找相对于构建根的 文件中的 。 并将其放置在相对于构建根目录的同一文件夹中。然而,如果 你不想把目标文件夹弄乱,你可以添加一个前缀到 源文件夹。下面是一个例子。

首先,我们在构建中指定一个源目录。您可以指定 文件 作为过滤器(如果需要),但默认情况下它会找到任何文件(结束 带".in")。如果需要,还可以指定排除目录选项 从源目录中排除一些路径。

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
2

现在我们将创建一个"template"目录,如buildout配置中所列 在上面,为我们的示例填充它。

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
3

注意,在运行buildout之前,helloworld.txt文件仍然是 我们没有etc目录,bin目录没有 helloworld.sh

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
4

现在我们安装。旧的"helloworld.txt"已经不见了,我们现在看到了etc.note 对于目标,如果中间文件夹没有 存在。

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
5

文件已经存在,并且具有我们期望的内容。

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
6

如果将 文件 选项与 源目录一起使用,则它将成为 过滤器。每个目标文件必须至少与 文件 中的一个名称匹配。 因此,如果我们只构建.sh文件,etc目录将消失。

< Buff行情>
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
7
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
8
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
9

还要注意,如果使用源目录和 文件,请指定 目录,目录必须精确匹配。

使用 exclude directories参数,我们指定一个或多个目录 (用空格分隔)其中配方将不查找模板 文件夹。"排除目录"选项应与 源目录选项。 因此,如果我们设置 排除目录 bin/helloworld.sh 文件将消失。

< Buff行情>
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... parts = message
...
... [message]
... recipe = z3c.recipe.filetemplate
... files = helloworld.txt
... world = Philipp
... """)
0
>>> write(sample_buildout, 'helloworld.txt.in',
... """
... Hello ${world}!
... """)
5
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... parts = message
...
... [message]
... recipe = z3c.recipe.filetemplate
... files = helloworld.txt
... world = Philipp
... """)
2
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... parts = message
...
... [message]
... recipe = z3c.recipe.filetemplate
... files = helloworld.txt
... world = Philipp
... """)
3
>>> write(sample_buildout, 'buildout.cfg',
... """
... [buildout]
... parts = message
...
... [message]
... recipe = z3c.recipe.filetemplate
... files = helloworld.txt
... world = Philipp
... """)
4

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java类之间并发性不一致的HashMap   插件如何在JavaSwing中使用UIManager和Classloader从外部jar安装外观?   java JasperReports:找不到子报表   在项目中找不到java生成的Javadoc文件   java BigDecimal。multiply()和divide()方法返回十六进制数。为什么?   java统计出现次数并从字符串中删除重复项   调用运算符时发生java NullPointerException   Spring和Hibernate之间的java配置错误   JavaZK将用户重定向回上一页   Javasocket为传出连接指定特定的网络接口   如果拖动到某个区域外,java Make按钮操作将被取消   如何在Eclipse for selenium 3.141.59中添加Java文档链接   java从匹配条件的数组中获取所有索引   docker未连接到RemoteWebDriver的java Gitlab ci selenium测试   java重写run方法   utf 8如何使用java解码UTF8编码的字符串?   java如何从eclipse调试部署在tomcat上的web应用程序?   将字母字符与前面没有百分号的Java正则表达式匹配