当脚本在 tmux 中运行时写入传感器用 python 读出

Writing sensor read out with python while script runs in tmux

如果之前有人问过这个问题,我深表歉意,但我找不到我正在寻找的解决方案/信息。

所以:我正在 运行使用 python 脚本读取 运行0W 并读取 4 个温度传感器来监控家里的一些东西。我每 2 分钟读取一次这些传感器,并将输出写入 CSV(目前对我来说足够了)。当我在 TMUX 中通过 ssh 我的 PI 和 运行 我的脚本时,我意识到调用我的“Sensordata.csv”时它只会更新,一旦我在我的 TMUX 会话中关闭脚本。理想情况下,我希望在每个轮询周期后更新我的“Sensordata.CSV”文件。

我相信它不是代码,因为我的代码在 运行 正常 shell 时打开、写入和关闭文件。希望有人能帮帮我 =)


import time
import csv
from datetime import datetime



def get_temp(dev_file):
    f = open(dev_file,"r")
    contents = f.readlines()
    f.close()
    index = contents[-1].find("t=")
    if index != -1 :
        temperature = contents[-1][index+2:]
        cels =float(temperature)/1000
        return cels

time_for_csv=time.asctime( time.localtime(time.time()))
f=open("Sensordata.csv", "a")
c=csv.writer(f)





if __name__ =="__main__":
    while True:
        dateTimeObj = datetime.now()
        timestampStr = dateTimeObj.strftime("%d-%b-%Y (%H:%M:%S.%f)")
        temp = get_temp("//sys/bus/w1/devices/28-0301a2799ec4/w1_slave")
        temp2 = get_temp("//sys/bus/w1/devices/28-0301a2790081/w1_slave")
        temp3 = get_temp("//sys/bus/w1/devices/28-012020be268d/w1_slave")
        tempout = get_temp("//sys/bus/w1/devices/28-00000b0f6540/w1_slave")
        print('Current Timestamp : ', timestampStr, "28-00000b0f6540 - Outside Sensor", tempout)
        print('Current Timestamp : ', timestampStr, "28-0301a2799ec4 - Floorheating out", temp)
        print('Current Timestamp : ', timestampStr, "28-0301a2790081 - Floorheating in", temp2)
        print('Current Timestamp : ', timestampStr, "28-012020be268d - Room Sensor", temp3)
        f = open("Sensordata.csv", "a")
        c = csv.writer(f)
        c.writerow([timestampStr, temp, temp2, temp3, tempout])
        f.close()
        time.sleep(120)

我认为 Tmux 不是问题的一部分。

尝试删除脚本中的这 3 行代码:

time_for_csv=time.asctime( time.localtime(time.time()))
f=open("Sensordata.csv", "a")
c=csv.writer(f)

time_for_csv 未使用。

打开文件进行写入或追加时,更安全的方法是使用以下方法:

with open("Sensordata.csv", "a") as f:
    c=csv.writer(f)
    c.writerow([timestampStr, temp, temp2, temp3, tempout])

即使出现异常,文件对象也将始终关闭。您不必明确关闭它。参见 With statement in Python

我猜你在脚本中间打开一个文件对象会留下一个文件打开,然后你在 if __name__ == "__main__ 之后重新定义 f。让文件对象保持打开状态可能会产生不可预知的结果,就像您正在经历的那样。