我编写了一个python代码来生成一个YAML文件(称为targets.yml
),该文件由一个名为prometheus的流行监控应用程序读取。 prometheus成功读取YAML文件及其内容,但它也会在日志中抛出错误,如下所示。
level=error msg="Error reading file "/var/targets/targets.yml": yaml:
line 218: found unexpected end of stream" source="file.go:199"
我无法摆脱这个错误,虽然我正确地关闭了YAML文件,下面是代码: -
while True:
create()
with open('/var/targets/targets.yml', 'w') as output:
print "opened the file to write"
i=0
for item in result:
if(item != None and item['status'] == "ACTIVE"):
print item['domains']['partner']
print item['status']
output.write("\n\n")
output.write("- targets: ['" + "https://" + item["domains"]["agency"] + "']\n")
output.write(" labels:\n")
output.write(" alias: " + item["alias"])
foo=item["name"]
#print foo
if isinstance(foo,basestring):
foo=foo.encode('utf8')
else:
foo=unicode(foo).encode('utf8')
output.close()
print("Waiting for 300 seconds, before relooping")
time.sleep(100)
此外,我认为我的文件扩展名没有任何区别。有人可以建议吗?
答案 0 :(得分:3)
with open('/var/targets/targets.yml', 'w') as output:
这是你问题的一部分,这不是原子问题。您需要创建一个临时文件,然后将其移动到位。
我还建议使用yaml库而不是手工创建它。
答案 1 :(得分:1)
详细说明brian-brazil's回答:这个操作不是原子的这个事实意味着另一个进程(对你的python脚本一无所知)可以在你完成写入之前读取你的YAML文件。
如果直接写入该文件绝对重要,您可能需要禁用缓冲(doc)并立即编写整个YAML文档。你可以通过将你当前正在进行的所有“写入”单独收集到一个字符串中然后一次性写入所有内容来实现。
而不是
output.write("\n\n")
output.write("- targets: ['" + "https://" + item["domains"]["agency"] + "']\n")
output.write(" labels:\n")
output.write(" alias: " + item["alias"])
你会做这样的事情:
yaml = ""
yaml += "\n\n"
yaml += "- targets: ['" + "https://" + item["domains"]["agency"] + "']\n"
yaml += " labels:\n"
yaml += " alias: " + item["alias"]
output.write(yaml)
这不是最有效的方法,但为了说明,它应该没问题。
答案 2 :(得分:0)
就我而言,引号 "
的开头和结尾不匹配,
但错误发生在另一个地方,然后是错误报告的那一行。