我写了一个python代码来生成一个YAML文件(称为targets.yml
(,该文件由一个名为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("nn")
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)
此外,我认为我的文件扩展名没有任何区别。有人可以建议吗?
with open('/var/targets/targets.yml', 'w') as output:
这是你问题的一部分,这不是原子的。您需要创建一个临时文件,然后将其移动到适当的位置。
我还建议使用 yaml 库,而不是手动创建它。
在我的情况下,报价的开盘价和收盘价不匹配"
, 但是错误在另一个地方,然后是错误报告的行。
编辑:正如布莱恩 - 巴西指出的那样,这不会解决问题,但可能会缓解症状。因此,只有当你绝对无法实现布莱恩-巴西的答案时,才应用这个答案。
详细阐述一下brian-brazil的答案:此操作不是原子的,这意味着另一个进程(对python脚本一无所知(可以在完成写入之前读取您的YAML文件。
如果直接写入该文件绝对重要,则可能需要禁用缓冲 (doc( 并一次写入整个 YAML 文档。你可以通过将你当前正在单独执行的所有"写入"收集到一个字符串中,然后一次写入所有这些来做到这一点。
而不是
output.write("nn")
output.write("- targets: ['" + "https://" + item["domains"]["agency"] + "']n")
output.write(" labels:n")
output.write(" alias: " + item["alias"])
你会做这样的事情:
yaml = ""
yaml += "nn"
yaml += "- targets: ['" + "https://" + item["domains"]["agency"] + "']n"
yaml += " labels:n"
yaml += " alias: " + item["alias"]
output.write(yaml)
这不是最有效的方法,但为了说明起见,它应该没问题。