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)
C'est un suivi sur la question pour http://stackoverflow.com/questions/32269775/python-raspberry-pi-if-path-doesnt-exist-skip-the-loop –