4

在过去的两个小时里,这是一个让我很烦恼的问题。我有一个包含多行的模板文件,在某些行中,某些单词必须由其他一些单词更改。这是我的模板的样子:

subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }} {}

subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }}
{
option domain-name-servers {{ MY_DOMAIN_IP }}; 
option domain-name {{ MY_DOMAIN_NAME }}; 
option routers {{ MY_GATEWAY }}; 
option broadcast-address {{ MY_BROADCAST }};

这是我正在使用的代码:

f = open(DHCPD_PATH, 'w')
g = open(TEMPLATE_PATH, 'r')
patterns = { 
   '{{ MAC_ADDRESS }}'     : mac,
   '{{ IP_ADDRESS }}'      : ip, 
   '{{ MY_IP }}'           : MY_IP,
   '{{ MY_DOMAIN_IP }}'    : MY_DOMAIN_IP,
   '{{ MY_DOMAIN_NAME }}'  : MY_DOMAIN_NAME,
   '{{ MY_NETMASK }}'      : MY_NETMASK,
   '{{ MY_GATEWAY }}'      : MY_GATEWAY,
   '{{ MY_SUBNET }}'       : MY_SUBNET,
   '{{ MY_BROADCAST }}'    : MY_BROADCAST,
}   
content = g.read()
for i,j in patterns.iteritems():
   content = content.replace(i,j)
f.write(content)
f.close()
g.close()

这是我得到的文件:

subnet 192.168.10.0 netmask {{ MY_NETMASK }} {}

subnet 192.168.10.0 netmask 255.255.255.0
{
  option domain-name-servers 192.168.10.10;
  option domain-name "localnet.lan";
  option routers 192.168.10.1;
  option broadcast-address 192.168.10.255;
  default-lease-time 600;
  max-lease-time 7200;
  filename "pxelinux.0";
  next-server 192.168.10.3;

我不明白为什么这个 {{ MY_NETMASK }} 仍然存在,而其中一个已被正确替换,而其他所有模板模式也被正确替换。

谁能给我一个提示?或者至少解释一下如何纠正它?

非常感谢

4

3 回答 3

8

@eumiro 猜对了:您的空间之一不是空间。

>>> repr('subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK }} {}')
"'subnet {{ MY_SUBNET }} netmask {{ MY_NETMASK\\xc2\\xa0}} {}'"
                                              ^^^^^^^^^^

看起来像一个不间断的空间。

于 2012-09-07T12:46:47.843 回答
3

非常感谢

为了提供更完整的答案(尽管您的答案很清楚可以解决我的问题),我想提供 vim 配置,这样可以避免我的痛苦:

为空格和表格提供不同的颜色:

:set syntax=whitespace

~/.vimrc 配置文件中的这一行如果你在打开文件后使用 :list 命令打印大部分不可见字符(:list! 以返回正常视图):

set listchars=nbsp:¤,tab:>-,trail:¤,extends:>,precedes:<,eol:¶,trail:· 

再次感谢

于 2012-09-07T13:31:32.543 回答
2

除了其他人指出的“不确定”字符...

这可能是矫枉过正,但是- 我很想安装jinja2 模板库,给它TEMPLATE_PATH(作为字符串,或者作为环境或文件的一部分),然后发出.render你的PATTERNS,这将成为:

PATTERNS = {
    'MAC_ADDRESS': '121422242424',
    # etc...
}

替换也将一次性完成,而不是迭代搜索/替换。您还可以在模板中放入合理的默认值,即:option something {{ MY_IP|default('127.0.0.1') }}

于 2012-09-07T13:01:49.390 回答