2013-02-02 78 views
3

我有一個讀取傳感器值的python腳本(摘錄如下所示)。不幸的是,它一次只運行5到60分鐘,然後突然停止。有沒有辦法讓我永遠有效地運行?爲什麼像這樣的python腳本不能在Raspberry Pi上永遠運行,或者python是否會自動限制腳本的持續時間?如何讓我的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() 
+2

爲何會停止?你收到任何錯誤消息嗎?你嘗試過調試嗎? – woemler

+0

對於永遠運行是使用一個無限循環,如果某些情況下檢查某些條件(如從傳感器讀取參數的某個值),則會停止某些條件。 – user1929959

+0

你可能有一些例外,你可能想要抓住。你有沒有分析你的程序的內存使用情況? – moooeeeep

回答

0

理論上,這應該永遠運行,Python不會自動限制腳本執行。我猜你是在readadcpac提要掛起並鎖定腳本時遇到問題,或執行中出現異常(但如果從命令行執行該腳本,則應該看到該問題)。腳本是否掛起或停止並退出?

如果您可以使用print()輸出一些數據並在Pi上看到它,那麼您可以添加一些簡單的調試行來查看它掛起的位置 - 您可能會或可能無法使用超時參數輕鬆修復它。另一種方法是對腳本進行線程化處理,並將循環體作爲一個線程運行,主線程充當監視程序,並在處理線程耗盡時間過長時停止處理線程。

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) 
+0

這是一個好主意。當內存不足時,可能會發生崩潰。我將消除該陣列並嘗試它。 – Alligator

+0

不,它沒有工作。每30秒鐘讀取一次,沒有排列,但在一個半小時左右後仍然停止。 – Alligator

+0

如果可能的話,最好在PC或筆記本電腦上執行相同的腳本以幫助確定問題是否由環境引起。如果腳本在PC上運行一段時間後也失敗,則其中一個函數調用可能會使異常消失並退出,這不會有幫助。 – Cryo