Yaml:发现意外的流结束

时间:2017-08-07 10:46:47

标签: python python-2.7 python-3.x yaml prometheus

我编写了一个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)

此外,我认为我的文件扩展名没有任何区别。有人可以建议吗?

3 个答案:

答案 0 :(得分:3)

with open('/var/targets/targets.yml', 'w') as output:

这是你问题的一部分,这不是原子问题。您需要创建一个临时文件,然后将其移动到位。

我还建议使用yaml库而不是手工创建它。

答案 1 :(得分:1)

编辑:正如布里安 - 巴西所指出的那样,这不会修复问题,但它可能会减轻症状。所以,如果你绝对不能实施brian-brazil的答案,那么只应用这个答案。

详细说明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)

就我而言,引号 " 的开头和结尾不匹配, 但错误发生在另一个地方,然后是错误报告的那一行。