当脚本在 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
。让文件对象保持打开状态可能会产生不可预知的结果,就像您正在经历的那样。
如果之前有人问过这个问题,我深表歉意,但我找不到我正在寻找的解决方案/信息。
所以:我正在 运行使用 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
。让文件对象保持打开状态可能会产生不可预知的结果,就像您正在经历的那样。