2013-07-29 3 views
0

Я использую скрипт python для передачи содержимого трех файлов в разные три файла. Исходными файлами являются данные из трех термометров, которые я подключил к RPI, работающему с raspian. Весь сценарий должен делать, это взять содержимое файлов и переместить их, чтобы я мог читать и анализировать другую программу (ComScript).Ошибка обработки файлов Python

Моя проблема в том, что если один или несколько термометров отключены до начала сценария, он замерзает. Он не замерзает, если я отключу термометр во время работы скрипта.

Вот код

import time 
a = 1 
while a == 1: 
try: 
    tfile = open("/sys/bus/w1/devices/28-000004d2ca5e/w1_slave") 
    text = tfile.read() 
    tfile.close() 
    temperature = text 



    tfile2 = open("/sys/bus/w1/devices/28-000004d2fb20/w1_slave") 
    text2 = tfile2.read() 
    tfile2.close() 
    temperature2 = text2 


    tfile3 = open("/sys/bus/w1/devices/28-000004d30568/w1_slave") 
    text3 = tfile3.read() 
    tfile3.close() 
    temperature3 = text3 



    textfile = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave1", "w ") 
    textfile2 = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave2", "w ") 
    textfile3 = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave3", "w ") 
    temperature = str(temperature) 
    temperature2 = str(temperature2) 
    temperature3 = str(temperature3) 
    textfile.write(temperature) 
    textfile2.write(temperature2) 
    textfile3.write(temperature3) 
    textfile.close() 
    textfile2.close() 
    textfile3.close() 
    print temperature 
    print temperature2 
    print temperature3 
    time.sleep(3) 

except: 
    pass 

Я добавил пропуск исключение, потому что мне это нужно, чтобы продолжать работать, даже если он получает плохие значения. Когда один из термометров отключен, файл, который пытается прочитать python, пуст, но все еще там.

+1

Ожидаете ли вы 'a' не равного 1 в какой-то момент? – roippi

ответ

4

Удалить одеяло за исключением.

Ваш скрипт не Замораживание, но любая ошибка, которую вы получаете, игнорируется в бесконечном цикле. Поскольку вы используете одеяло except:, вы поймаете все исключений, включая исключение прерывания клавиатуры KeyboardInterrupt.

В самом крайнем случае журнала исключения, и поймать только Exception:

except Exception: 
    import logging 
    logging.exception('Oops: error occurred') 

KeyboardInterrupt является подклассом BaseException, не Exception и не будет пойман этим исключением обработчика.

Посмотрите на shutil module для копирования файлов, вы делаете слишком много работы:

import time 
import shutil 
import os.path 

paths = ('28-000004d2ca5e', '28-000004d2fb20', '28-000004d30568') 

while True: 
    for i, name in enumerate(paths, 1): 
     src = os.path.join('/sys/bus/w1/devices', name, 'w1_slave') 
     dst = '/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave{}'.format(i) 
     try: 
      shutil.copyfile(src, dst) 
     except EnvironmentError: 
      import logging 
      logging.exception('Oops: error occurred') 

    time.sleep(3) 

Обработка файлов должны только когда-либо рейз EnvironmentError или его подклассов, есть нет нужно все успеть Вот.

+0

Спасибо, и я попробую это, но почему python перестает печатать данные, которые он говорит в скрипте, и почему компьютер начинает работать очень тяжело. – user2631867

+0

бесконечные петли делают это ... –

+0

@ user2631867: Это потому, что у вас бесконечный цикл. Даже вызов 'time.sleep (3)' пропускается, поэтому цикл удерживает CPU занятым. –

0

Открывание устройства, не подключенного к сети, скорее всего блокируется, потому что драйвер устройства не открывается, если устройство отсутствует.

Вам необходимо использовать os.open, который является эквивалентом системного вызова Unix «open» и указать флаг O_NONBLOCK и проверить код возврата. Затем вы можете использовать os.fdopen, чтобы вернуть возвращаемое значение os.open в обычный файл-файл Python.

+1

Это не приведет к переходу процессора в овердрайв и включению вентилятора. См. Комментарий ниже моего ответа; код находится в бесконечном цикле. –

+0

Нет, не будет. Но это также вероятный фактор. –

Смежные вопросы