我原来的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()
我试图通过这样做使其兼容:
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
我在这里搜索了答案,我正在尝试的任何东西似乎都没有用。我在这里做错了什么?
答案 0 :(得分:6)
错误告诉了所有内容,当您需要映射(tuple
)时,您将__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'
中的百分号
答案 1 :(得分:1)
您可以从格式字符串中删除名称,例如%(hostNameshort)s
到%s
,或者将这些数据作为字典提供。
答案 2 :(得分:0)
删除字符串的名称并将其替换为“%s”,然后将每个变量映射到它(必要时重复)。另外删除或更改部分
“登录。%Y%米%d \”
因为它也试图映射而且找不到相应的值