【问题标题】:python script printing to txt when startet manually but not at startup via rc.local on bootuppython脚本在手动启动时打印到txt,但不是在启动时通过rc.local在启动时打印
【发布时间】:2021-03-22 15:37:29
【问题描述】:

我正在尝试让我的树莓派将数据从外部传感器打印到显示器并同时将其保存为 .txt。

通过 ssh 在 shell 中启动脚本时,我所做的工作正常。但这会在关闭 shell 后停止脚本。

所以我尝试将它放在 rc.local 文件中以在启动时启动它。但这只是半途而废,因为它会在显示屏上显示数据,但不会将其保存到文件中。

import grovepi

from grovepi import *
from grove_rgb_lcd import *
from time import sleep, strftime
from math import isnan


#port definition
dht_sensor_port = 7 
dht_sensor_type = 0 
led_green = 5
led_red = 6
f = open("hwd.txt", "w")

#rgb display color
setRGB(0,255,0)

while True:
    try:
        [ temp,hum ] = dht(dht_sensor_port,dht_sensor_type)
        print("temp =", temp, "C\thumidity =", hum,"%")
        print("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),(temp,hum)), file=f)

        if isnan(temp) is True or isnan(hum) is True:
            raise TypeError('nan error')

        t = str(temp)
        h = str(hum)    
        
        setText_norefresh("Temp:" + t + "C\n" + "Humidity :" + h + "%")

        if hum < 40.0 or hum > 60.0:
            grovepi.digitalWrite(led_red,1)
            grovepi.digitalWrite(led_green,0)
        else:
            grovepi.digitalWrite(led_green,1)
            grovepi.digitalWrite(led_red, 0)

    except (IOError, TypeError) as e:
        print(str(e))
        setText("")

    except KeyboardInterrupt as e:
        print(str(e))
        setText("")
        break

    sleep(1)

``

【问题讨论】:

    标签: python raspberry-pi grovepi+


    【解决方案1】:

    您正在运行一个无限循环,因此您需要关闭文件流以将更改保存到您的文件中。如果您在没有循环的情况下运行脚本,您可以看到即使没有关闭 Steam,更改也会保存,这是因为它隐式处理。因此,您需要打开和关闭文件流,这可以使用 with 关键字轻松完成。我认为下面的代码很适合你。

    import grovepi
    
    from grovepi import *
    from grove_rgb_lcd import *
    from time import sleep, strftime
    from math import isnan
    
    # port definition
    dht_sensor_port = 7
    dht_sensor_type = 0
    led_green = 5
    led_red = 6
    
    # rgb display color
    setRGB(0, 255, 0)
    
    while True:
        try:
            [temp, hum] = dht(dht_sensor_port, dht_sensor_type)
            print("temp =", temp, "C\thumidity =", hum, "%")
            with open("hwd.txt", "w") as f:
                print("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"), (temp, hum)), file=f)
    
            if isnan(temp) is True or isnan(hum) is True:
                raise TypeError('nan error')
    
            t = str(temp)
            h = str(hum)
    
            setText_norefresh("Temp:" + t + "C\n" + "Humidity :" + h + "%")
    
            if hum < 40.0 or hum > 60.0:
                grovepi.digitalWrite(led_red, 1)
                grovepi.digitalWrite(led_green, 0)
            else:
                grovepi.digitalWrite(led_green, 1)
                grovepi.digitalWrite(led_red, 0)
    
        except (IOError, TypeError) as e:
            print(str(e))
            setText("")
    
        except KeyboardInterrupt as e:
            print(str(e))
            setText("")
            break
    
        sleep(1)
    

    【讨论】:

    • 仍然是同样的问题,它运行并且数据显示在液晶显示器上,但是在启动时没有生成 .txt 文件(或者如果文件已经存在,则保存数据),但工作正常当通过 ssh shell 手动启动时。
    • 显示屏上的数据是否保持更新?可能由于权限错误或其他原因脚本失败。尝试添加except Exception as e 并在显示屏上打印错误。或者您在错误的目录中查找文件。
    • 显示工作正常,唯一的问题是将数据记录到 txt。我听说在后台运行 python 脚本存在问题,这基本上就是 rc.local 所做的。会有意义,因为它在手动启动时起作用。我会在周末尝试了解更多信息,因为我现在工作超负荷。非常感谢您到目前为止的努力,已经帮助了我很多。当我知道更多时会发送更新。
    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2014-01-02
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多