我有一个读取温度传感器文件并将其写入db的功能。但是,传感器不会一直连接,因为它们是便携式的。可能发生的是,在脚本中间,传感器断开,导致该功能停止并等待传感器连接回来。我希望即使没有传感器也可以运行该功能。
由于函数循环检查不同的传感器,我正在考虑跳过循环或其中的函数。
我在这里发现了类似的内容: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 :(得分:0)
您正在向您的流程发送信号,但您的脚本无法捕获该信号。
尝试捕捉和处理信号。
def alarm_received(signo, stack):
print "signal caught {}".format(signo)
signal.signal(signal.SIGALRM, alarm_received)