1

我原来的 2.7 代码在这里:

            myFile = open(prjFile, 'w+')
            myFile.write("""<VirtualHost 192.168.75.100:80>
    ServerName www.{hostName}
    ServerAlias {hostNameshort}.* www.{hostNameshort}.*
    DocumentRoot {prjDir}/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/{prjCode}/\{hostName}.log.%Y%m%d\" urchin"
</VirtualHost>""".format(hostName=hostName, hostNameshort=hostNameshort, prjDir=prjDir, prjCode=prjCode))
            myFile.close()

我试图通过这样做使其与 2.4 兼容:

myFile = open(prjFile, 'w+')
myFile.write("""<VirtualHost 192.168.75.100:80>
    ServerName www.%(hostName)s
    ServerAlias %(hostNameshort).* www.%(hostNameshort)s.*
    DocumentRoot %(prjDir)s/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/prjCode}/\%(hostName)s.log.%Y%m%d\" urchin"
</VirtualHost>""" % ('hostName', 'hostNameshort', 'prjDir', 'prjCode'))
myFile.close()

但我的错误是

Traceback (most recent call last):
  File "testfunction.py", line 20, in <module>
    </VirtualHost>""" % ('hostName', 'hostNameshort', 'prjDir', 'prjCode'))
TypeError: format requires a mapping

我在这里搜索了答案,但我尝试的任何方法似乎都不起作用。我在这里做错了什么?

4

3 回答 3

5

该错误说明了一切,当它需要映射 ( ) 时,您正在传递一个tupleto 。例如,您想要类似的东西:__mod__dict

print """<VirtualHost 192.168.75.100:80>
    ServerName www.%(hostName)s
    ServerAlias %(hostNameshort)s.* www.%(hostNameshort)s.*
    DocumentRoot %(prjDir)s/html
    CustomLog \\|/usr/sbin/cronolog /var/log/httpd/class/prjCode}/\%(hostName)s.log.%%Y%%m%%d\" urchin"
</VirtualHost>""" % dict(hostName='foo',hostNameshort='bar',prjDir='baz')

我还需要做一些其他的事情。我需要s在这一行添加一个:

ServerAlias %(hostNameshort).* www.%(hostNameshort)s.*

我需要%在最后一行加倍以逃避百分号'%Y%m%d'

于 2013-06-04T15:22:54.353 回答
1

您可以从格式字符串中删除名称,例如将该数据作为字典提供或提供%(hostNameshort)s%s

于 2013-06-04T15:24:06.983 回答
0

删除字符串的名称并将它们替换为“%s”,然后将每个变量映射到它(必要时重复)。另外删除或更改部分

".log.%Y%m%d\"

因为它也在尝试被映射,并没有找到对应的值

于 2013-06-04T15:31:37.990 回答