Python - 超时 - 跳过函数或循环

时间:2015-08-29 08:00:12

标签: python raspberry-pi2 temperature

我有一个读取温度传感器文件并将其写入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)

1 个答案:

答案 0 :(得分:0)

您正在向您的流程发送信号,但您的脚本无法捕获该信号。

尝试捕捉和处理信号。

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

signal.signal(signal.SIGALRM, alarm_received)