2015-08-28 2 views
2

J'ai une fonction pour collecter la température (valeurs à partir de fichiers texte) qui utilise un chemin partiellement prédéfini. Cependant, parfois le chemin n'existe pas si le capteur de température n'a pas été chargé (est déconnecté). Comment puis-je définir une condition ou une exception pour ignorer une boucle si un chemin n'est pas disponible?Python Raspberry pi - Si le chemin n'existe pas, ignore la boucle

Je voulais utiliser continuer, mais je n'ai aucune idée de la condition à régler avec elle.

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 

Répondre

2

Utilisez os.path.isfile et os.path.isdir() pour vérifier.

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

veulent probablement 'il CONTINUE, pas' break', de sorte que le reste des capteurs sont encore traités – tom

+0

Mise à jour de continuer @ Tom. – luoluo

+0

après avoir ajouté ce que vous avez suggéré, il s'arrête dans une boucle lorsque le capteur est manquant et signale IndexError: liste index hors de portée. – Miroslav

2

Je ne sais pas pourquoi vous utilisez subprocess.Popen pour lire le fichier. Pourquoi ne pas simplement l'ouvrir() et lire()?

Une façon python pour gérer dir ou fichier manquant est quelque chose comme ceci:

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

Si vous voulez éviter la pendaison en open() ou lire(), vous pouvez ajouter un gestionnaire de signaux et donnez-vous un signal d'alarme après, disons, 5 secondes. Cela va interrompre la fonction et vous déplacer dans la clause except.

Configuration du gestionnaire de signal au début:

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

et modifier votre boucle pour appeler alarm(5) avant la partie qui peut se bloquer. Appelez l'alarme (0) à la fin pour annuler l'alarme.

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

Probablement utile d'expliquer ce qu'est 'IOError' et une remarque sur l'utilisation de' try sauf 'car il ne semble pas que le PO le connaisse. – SuperBiasedMan

+0

ce cas fait exactement la même chose en termes de rapport d'erreur. J'ai utilisé le sous-processus car il était recommandé en raison de problèmes occasionnels de lecture. mais comme je suis très nouveau sur python, je n'ai aucune idée ... – Miroslav

+0

@Miroslav J'ai ajouté du code pour gérer les blocages. – meuh