我使用带有raspbian,Rasain Wheezy 2014年1月和python3
的覆盆子pi我正在从rc.local启动一个python脚本,它捕获键盘输入并写入文件,而无需登录。
如果尚未创建脚本正在写入的文件,则第一个键盘输入将在屏幕上注册,但不会写入该文件。所有后续写入都可以正常工作。
当我从命令行运行它时,我的代码工作正常,用户已登录,第一行按预期写入新文件。
来自MIDNIGHTER的编辑代码
#!/usr/bin/env python3.2
import sys
from datetime import datetime
def main():
f = open('/home/pi/cards.csv','r')
sim = f.read()
sim = sim.split('\n')
simSet = set(sim)
while True:
try:
log = open('logs', 'a')
puk = input() # text input, i.e., always a string
included = "true" if puk in simSet else "false"
print(included, puk)
log.write("{included: %s, time: %s, number: %s}, \n" % (included, datetime.now(), puk))
log.close()
except ValueError:
log.close()
main()
和rc.local
sudo python3 /home/pi/rf1
我刚刚学习这个,请原谅执行不力。
解
我意识到现在我遗漏了关于cron作业关闭和复制正在写入的文件的重要细节。
我在这里找到了答案what exactly the python's file.flush() is doing?
而不是file.close.()
我使用file.flush()
并且它有效。
以下代码:
#!/usr/bin/env python3.2
import sys
from datetime import datetime
def main():
f = open('/home/pi/cards.csv','r')
sim = f.read()
sim = sim.split('\n')
simSet = set(sim)
log = open('logs', 'a')
while True:
try:
puk = input() # text input, i.e., always a string
included = "true" if puk in simSet else "false"
print(included, puk)
log.write("{included: %s, time: %s, number: %s}, \n" % (included, datetime.now(), puk))
log.flush()
except ValueError:
log.flush()
main()
答案 0 :(得分:0)
问题是我正在运行一个cron作业,它将数据复制到另一个正在访问python程序中写入文件的文件。
此后的第一次写入未保存到文件中,因为它正被另一个程序访问。
这些段落似乎正在发生的事情:
https://stackoverflow.com/a/7127162/1441620
第一个,flush,将简单地写出任何徘徊在a中的数据 程序缓冲区到实际文件。通常这意味着数据 将从程序缓冲区复制到操作系统缓冲区。
具体来说,这意味着如果另一个流程具有相同的功能 文件打开以供阅读,它将能够访问您刚才的数据 刷新到文件。但是,它并不一定意味着它已经存在 "永久"存储在磁盘上。
我认为@Midnighter还建议使用with
语句来打开和关闭文件也会解决它。
更新的代码在问题>溶液