3

我有一个读取传感器值的 python 脚本(摘录如下)。不幸的是,它一次只运行 5 - 60 分钟,然后突然停止。有没有办法可以有效地让它永远运行?为什么像这样的 python 脚本不能在 Raspberry Pi 上永远运行,或者 python 会自动限制脚本的持续时间?

 while True:
    current_reading = readadc(current_sensor, SPICLK, SPIMOSI, SPIMISO, SPICS)
    current_sensed = (1000.0 * (0.0252 * (current_reading - 492.0))) - correction_factor

    values.append(current_sensed)
    if len(values) > 40:
           values.pop(0)

    if reading_number > 500:
           reading_number = 0

    reading_number = reading_number + 1

    if ( reading_number == 500 ):
           actual_current = round((sum(values)/len(values)), 1)

           # open up a cosm feed
           pac = eeml.datastream.Cosm(API_URL, API_KEY)

           #send data
           pac.update([eeml.Data(0, actual_current)])

           # send data to cosm
           pac.put()
4

2 回答 2

1

看起来您的循环似乎没有延迟,并且不断地附加您的“值”数组,这可能会导致您在相当短的时间内耗尽内存。我建议添加延迟以避免每次都附加值数组。

添加延迟:

import time
while True:
    current_reading = readadc(current_sensor, SPICLK, SPIMOSI, SPIMISO, SPICS)
    current_sensed = (1000.0 * (0.0252 * (current_reading - 492.0))) - correction_factor

    values.append(current_sensed)
    if len(values) > 40:
           values.pop(0)

    if reading_number > 500:
           reading_number = 0

    reading_number = reading_number + 1

    if ( reading_number == 500 ):
           actual_current = round((sum(values)/len(values)), 1)

           # open up a cosm feed
           pac = eeml.datastream.Cosm(API_URL, API_KEY)

           #send data
           pac.update([eeml.Data(0, actual_current)])

           # send data to cosm
           pac.put()
    time.sleep(1)
于 2013-02-02T21:23:40.293 回答
0

理论上,这应该永远运行,并且 Python 不会自动限制脚本执行。我猜你遇到了问题readadcpac提要挂起并锁定脚本或执行中的异常(但你应该看到如果从命令行执行脚本)。脚本是挂起还是停止并退出?

如果您可以使用 Pi 输出一些数据print()并在 Pi 上查看它,您可以添加一些简单的调试行来查看它挂在哪里 - 您可能无法使用超时参数轻松修复它。另一种方法是线程化脚本并将循环体作为线程运行,主线程充当看门狗,如果处理线程花费太长时间来完成他们的工作,则终止处理线程。

于 2013-02-02T20:24:02.567 回答