2015-08-28 2 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.isfile и os.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

, вероятно, хотите 'continue' там, а не' break', так что остальные датчики по-прежнему обрабатываются – tom

+0

Update для продолжения @tom. – luoluo

+0

после добавления того, что вы предложили, он останавливается в цикле, когда отсутствует датчик, и сообщает IndexError: индекс индекса за пределами диапазона. – Miroslav

2

Я не уверен, почему вы используете подпроцесс. Откройте для чтения файл. Почему бы просто не открыть() его и прочитать() ?.

питона способ справиться с недостающей реж или файл что-то вроде этого:

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') 
    ... 

Если вы хотите, чтобы избежать висит в открытом() или читать(), вы можете добавить обработчик сигнала и подать сигнал тревоги после, скажем, 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 except 'поскольку это не похоже на то, что OP знаком с ним. – SuperBiasedMan

+0

Этот случай делает то же самое с точки зрения отчета об ошибке. Я использовал подпроцесс, потому что это было рекомендовано из-за случайных проблем с его чтением. но поскольку я очень новичок в python, у меня нет подсказки ... – Miroslav

+0

@ Мирослав Я добавил код для обработки зависаний. – meuh