2015-08-29 1 views
0

У меня есть функция для чтения файлов датчиков температуры и записи в db. Тем не менее, датчики не будут подключаться все время, поскольку они переносимы. Что может случиться, так это то, что в середине сценария отключен датчик, который в настоящее время вызывает эту функцию, и ожидает, что датчик будет подключен обратно. Я хочу, чтобы функция работала даже без датчиков.Python - Timeout - пропустить функцию или цикл

Поскольку функция является циклической проверкой различных датчиков, я думал о пропуске цикла или функции в нем.

Я нашел что-то подобное отсюда: Timeout function if it takes too long to finish Это работает отлично, за исключением того, что, как думают, он прерывает функцию и останавливает сценарий .... Мне нужно, чтобы она снова запускалась. Спасибо за помощь.

Вот код:

def read_all(): 

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

    for sensor in sensors: 
     os.system('modprobe w1-gpio') 
     os.system('modprobe w1-therm') 

     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 
     @timeout(5):  
     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 
     def read_temp(): 
      lines = read_temp_raw() 
      while lines[0].strip()[-3:] != 'YES': 
       time.sleep(0.2) 
       lines = read_temp_raw() 
      equals_pos = lines[1].find('t=') 
      if equals_pos != -1: 
       temp_string = lines[1][equals_pos+2:] 
       temp_c = float(temp_string)/1000.0 
       temp_f = temp_c * 9.0/5.0 + 32.0 
       return temp_c 

     temp = read_temp() 

     db=MySQLdb.connect("localhost","root","password","temps") 
     curs=db.cursor() 
     loggit= "insert into log1 values (current_date(), now(), %s, %s)" 
     curs.execute (loggit, (temp, sensor)) 
     db.commit()   

     print temp, sensor 
     #print(read_temp()) 

while True: 
    read_all() 
    time.sleep(1) 
+0

Это является продолжением на вопрос http://stackoverflow.com/questions/32269775/python-raspberry-pi-if-path-doesnt-exist-skip-the-loop –

ответ

0

вы посылаете сигнал к процессу, который не поймал скриптом.

попытаться поймать и обработать сингл.

def alarm_received(signo, stack): 
    print "signal caught {}".format(signo) 

signal.signal(signal.SIGALRM, alarm_received) 
+0

могли бы вы быть немного конкретнее о том, где я должен вставить это? – Miroslav

+0

вы можете добавить метод someehre в свой скрипт. читайте больше о сигнале. https://docs.python.org/2/library/signal.html –

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