2015-08-28 70 views
2

我有一個函數來收集使用部分預定義路徑的溫度(來自文本文件的值)。但是,如果溫度傳感器未加載(斷開連接),有時路徑不存在。如果路徑不可用,如何設置條件或異常以跳過循環?Python Raspberry pi - 如果路徑不存在,跳過循環

我想繼續使用,但我不知道用它來設置什麼條件。

def read_all(): 

    base_dir = '/sys/bus/w1/devices/' 
    sensors=['28-000006dcc43f', '28-000006de2bd7', '28-000006dc7ea9', '28-000006dd9d1f','28-000006de2bd8'] 

    for sensor in sensors: 

     device_folder = glob.glob(base_dir + sensor)[0] 
     device_file = device_folder + '/w1_slave' 

     def read_temp_raw(): 
      catdata = subprocess.Popen(['cat',device_file], stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
      out,err = catdata.communicate() 
      out_decode = out.decode('utf-8') 
      lines = out_decode.split('\n') 
      return lines 

回答

2

使用os.path.isfileos.path.isdir()來檢查。

for sensor in sensors: 
    device_folders = glob.glob(base_dir + sensor) 
    if len(device_folders) == 0: 
     continue 
    device_folder = device_folders[0] 
    if not os.path.isdir(base_dir): 
     continue 
    device_file = device_folder + '/w1_slave' 
    if not os.path.isfile(device_file) 
     continue 
    .... 
+0

可能希望'繼續'在那裏,而不是'break',所以剩下的傳感器仍在處理中 – tom

+0

更新以繼續@tom。 – luoluo

+0

添加所建議的內容後,當傳感器丟失時,它將在循環中停止並報告IndexError:列表索引超出範圍。 – Miroslav

2

我不知道你爲什麼使用subprocess.Popen來讀取文件。 爲什麼不打開()它和read()?.

一個Python的方式來處理缺少目錄或文件是這樣的:

for sensor in sensors: 
    try: 
     device_folder = glob.glob(base_dir + sensor)[0] 
     device_file = device_folder + '/w1_slave' 
     with open(device_file) as fd: # auto does fd.close() 
      out = fd.read() 
    except (IOError,IndexError): 
     continue 
    out_decode = out.decode('utf-8') 
    ... 

如果你想避免掛在open()或閱讀(),您可以添加一個信號處理器 和例如5秒後給自己發出警報信號。這會中斷 該功能,並將您轉移到except子句中。

設置在開始的信號處理程序:

import signal 
def signal_handler(signal, frame): 
    raise IOError 
signal.signal(signal.SIGALRM, signal_handler) 

和修改你的循環可能會掛部分之前調用alarm(5)。 結束時呼叫警報(0)以取消警報。

for sensor in sensors: 
    signal.alarm(5) 
    try: 
     device_file = ... 
     with open(device_file) as fd: 
      out = fd.read() 
    except (IOError,IndexError): 
     continue 
    finally: 
     signal.alarm(0) 
    print "ok" 
    ... 
+0

可能值得解釋「IOError」是什麼以及使用'try '因爲它看起來不像OP熟悉它。 – SuperBiasedMan

+0

這種情況在錯誤報告方面完全一樣。由於偶爾會出現讀取問題,因此我推薦使用子流程。但是因爲我對Python非常陌生,所以我沒有線索...... – Miroslav

+0

@Miroslav我添加了處理掛起的代碼。 – meuh