从rc.local开始的python脚本写入文件缺少使用python和linux的第一次写入

时间:2014-05-13 10:57:06

标签: python linux

我使用带有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()

1 个答案:

答案 0 :(得分:0)

问题是我正在运行一个cron作业,它将数据复制到另一个正在访问python程序中写入文件的文件。

此后的第一次写入未保存到文件中,因为它正被另一个程序访问。

这些段落似乎正在发生的事情:

https://stackoverflow.com/a/7127162/1441620

  

第一个,flush,将简单地写出任何徘徊在a中的数据   程序缓冲区到实际文件。通常这意味着数据   将从程序缓冲区复制到操作系统缓冲区。

     

具体来说,这意味着如果另一个流程具有相同的功能   文件打开以供阅读,它将能够访问您刚才的数据   刷新到文件。但是,它并不一定意味着它已经存在   "永久"存储在磁盘上。

我认为@Midnighter还建议使用with语句来打开和关闭文件也会解决它。

更新的代码在问题>溶液