我正在使用Raspberry PI并使用python脚本从声音传感器输出值。为了显示这一点,我在我的PI上使用了一个HTML页面,它调用了一个javascript include,它只是一行,用于定义一个值,用于更改Google量表显示的内容。所有这些都非常简单明了,并且可以满足我的需求。 (增加了我真正了解其工作原理的奖励。)
.js文件是由我的python脚本写出来的,它也做了很多其他的东西。这一切实际上完全按照我的意愿工作,并且写入文件的值是准确的,并且如果我将其作为单个循环运行而不是在运行它的连续“监视服务”模式下,则在测量仪上正确显示直到被打断。
这是问题的开始我认为:测量声级的循环在5秒内运行~30k次。在我的python代码中,我使用:
with open(web_file, 'w') as f_output:
f_output.write("var int_level = " + str(per_detected))
f_output.close()
我这样做是因为我 THINK 我需要每次都关闭因为循环(我知道“with”是一个隐式关闭,但因为我每次都重新打开文件似乎更好地通过强制关闭它来确定),但是我认为它也可能是问题。 (我也是故意使用模式'w'所以我每次都可以重置文件,因为它只有一行 - 看起来比更换一个值更快,计算成本更低)
症状是Google规格HTML页面每5秒刷新一次以加载新值,但是规格本身只能每10次刷新一次,但这完全是随机的,显然表明没有值。要返回的.js文件。我认为这意味着它可能会在几次尝试中获胜并在收盘前点击文件,或者它是否太快而且这是一种愚蠢的方式呢?
另外需要注意的是,当我从PI命令行中获取level.js(< - include文件)时,在“查杀”我的python代码后,它是空的。
我有以下所有代码(包括HTML页面):
https://www.GitHub.com/ChrisHarrold/Pi-Projects
如果您想查看更多细节。它被评论为6种方式,直到星期日所以我应该弄清楚我做了什么以及为什么。
答案 0 :(得分:5)
绝对不需要.close()
。问题是您的浏览器在文件仍在打开时并且不时地以截断(如此空)的状态查找文件。并且你永远不能足够快地关闭文件以防止这种情况发生。
您应该做的是将文件写入不同的文件名,然后重命名文件以替换旧文件。这是一个原子操作(意味着操作系统保证对文件的任何其他访问将获得旧文件或新文件,但绝不仅仅是两者的一部分)。
这很简单:
with open(web_file + '.new', 'w') as f_output:
f_output.write("var int_level = " + str(per_detected))
os.rename(web_file + '.new', web_file)
上面的代码写出了一个不同的文件名,一个以.new
结尾,只有当写完成(并且文件关闭)时,它是否移动到位以替换旧版本的文件。