У меня есть функция для чтения файлов датчиков температуры и записи в 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)
Это является продолжением на вопрос http://stackoverflow.com/questions/32269775/python-raspberry-pi-if-path-doesnt-exist-skip-the-loop –