Python Yaml:发现意外的流结束
我编写了一个python代码来生成YAML文件(称为Python Yaml:发现意外的流结束,python,python-2.7,python-3.x,yaml,prometheus,Python,Python 2.7,Python 3.x,Yaml,Prometheus,我编写了一个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" 我无法
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("\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)
我也不认为我的文件扩展名有什么区别。有人能推荐一下吗
with open('/var/targets/targets.yml', 'w') as output:
这是你问题的一部分,这不是原子的。您需要创建一个临时文件,然后将其移动到位
我还建议使用yaml库,而不是手工创建
这是你问题的一部分,这不是原子的。您需要创建一个临时文件,然后将其移动到位
我还建议使用yaml库,而不是手工创建。EDIT:正如brian brazil所指出的,这不会解决问题,但可能会缓解症状。所以,只有当你绝对不能实现brian brazil的答案时,才应用这个答案。
详细说明一下答案:这个操作不是原子操作这一事实意味着另一个进程(对python脚本一无所知)可以在完成编写之前读取YAML文件
如果直接写入该文件是绝对重要的,那么您可能希望禁用缓冲并立即写入整个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)
这不是最有效的方法,但为了举例说明,它应该是好的。编辑:正如brian brazil所指出的,这不会解决问题,但可能会缓解症状。所以,只有当你绝对不能实现brian brazil的答案时,才应用这个答案。
详细说明一下答案:这个操作不是原子操作这一事实意味着另一个进程(对python脚本一无所知)可以在完成编写之前读取YAML文件
如果直接写入该文件是绝对重要的,那么您可能希望禁用缓冲并立即写入整个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)
这不是最有效的方法,但为了便于说明,应该可以。很抱歉,请您澄清“然后将其移动到位”。我没有得到您答案的这一部分。请将yaml写入一个临时文件(例如/tmp/temporary targets.yml),然后将该文件移动到/var/targets/targets。yml@brian-不幸的是,这仍然不能解决问题。我在普罗米修斯配置的
file\u sd\u config
中使用这个文件,运行一个应用程序,该应用程序将这个文件作为一个侧车容器与普罗米修斯一起放在一个吊舱中。我还尝试检查了刷新间隔是否导致了这个问题,因为在我的应用程序代码中,我每300秒循环一次。但我也无法从这里了解到任何情况。很抱歉,请您澄清一下“然后将其移到适当的位置”。我没有得到您答案的这一部分。请将yaml写入一个临时文件(例如/tmp/temporary targets.yml),然后将该文件移动到/var/targets/targets。yml@brian-不幸的是,这仍然不能解决问题。我在普罗米修斯配置的file\u sd\u config
中使用这个文件,运行一个应用程序,该应用程序将这个文件作为一个侧车容器与普罗米修斯一起放在一个吊舱中。我还尝试检查了刷新间隔是否导致了这个问题,因为在我的应用程序代码中,我每300秒循环一次。但也无法从这里找出任何东西。这其实没有什么区别,编写一个文件,然后重命名
是一种方法。我认为这会缓解问题的节奏,但不会彻底解决问题。这就是为什么我将它指定为直接写入文件是否重要的解决方案。我添加了一个免责声明。@philip Stark不幸的是,正如我在brian brazil的回答中提到的,所有建议都无法解决问题。这并没有真正的区别,写一个文件,然后重命名是一种方法。我认为这会缓解问题的节奏,但不会彻底解决问题。这就是为什么我将它指定为直接写入文件是否重要的解决方案。我添加了一个免责声明。@philip Stark不幸的是,正如我在brian brazil的回答中提到的,所有建议都无法解决问题。普罗米修斯希望文件的结构如何?您需要个人yaml文档吗?这些标记为---或。。。(我不记得了)。你可能需要附加到文件而不是覆盖它吗?@PhilipStark我想我写yaml文件的方式应该没问题,因为如果它不是普罗米修斯所期望的,它会给我一个错误。相反,它以随机间隔抛出一个错误,我想知道这是否与刷新间隔(默认值为300秒)和每隔100秒生成一个应用程序yaml文件有关(如上面的应用程序代码)。请注意,在我的例子中,我必须覆盖该文件。然后我建议您使用pyyaml模块来构建您的yaml文档。在某些情况下,可能存在yaml语法错误。item[“alias”]或item[“domains”][“agency”]的可能值是什么?@PhilipStark item[alias]只是一个类似“example”的字符串,item[“domains”][“agency”]也是一个类似“ui.xyz.abc.net”的字符串。就像你说的,也许pyyaml是一个更好的选择。普罗米修斯希望这个文件是如何构造的