2015-08-29 4 views
0

J'ai une fonction pour lire les fichiers de capteurs de température et les écrire en db. Cependant, les capteurs ne seront pas connectés tout le temps car ils sont portables. Ce qui peut arriver est qu'au milieu du script, un capteur est déconnecté ce qui provoque actuellement l'arrêt de la fonction et attend que le capteur soit connecté de nouveau. Je veux que la fonction fonctionne même sans capteurs. Comme la fonction est en boucle vérifiant différents capteurs, je pensais à sauter la boucle ou une fonction à l'intérieur.Python - Timeout - sauter la fonction ou la boucle

J'ai trouvé quelque chose de similaire à partir d'ici: Timeout function if it takes too long to finish Cela fonctionne parfaitement à l'exception d'un pense, il casse la fonction et arrête le script .... Je ai besoin pour fonctionner à nouveau à la place. Merci de votre aide.

Voici le code:

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

C'est un suivi sur la question pour http://stackoverflow.com/questions/32269775/python-raspberry-pi-if-path-doesnt-exist-skip-the-loop –

Répondre

0

vous envoyez un signal à votre processus, qui n'est pas pris par votre script. Essayez d'attraper et de traiter le singal.

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

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

pourriez-vous s'il vous plaît être un peu plus précis sur où devrais-je insérer cela? – Miroslav

+0

vous pouvez ajouter la méthode somewehre dans votre script. s'il vous plaît en savoir plus sur signal.handling https://docs.python.org/2/library/signal.html –