0

我正在使用 python 脚本将三个文件的内容传输到不同的三个文件。原始文件是我连接到运行 raspian 的 RPI 的三个温度计的数据。所有脚本应该做的是获取文件的内容并移动它们,以便我可以让另一个程序(ComScript)读取和解析它们。

我的问题是,如果一个或多个温度计在脚本开始之前断开连接,它就会冻结。如果我在脚本运行时断开温度计,它不会冻结。

这是代码

import time
a = 1
while a == 1:
 try:
    tfile = open("/sys/bus/w1/devices/28-000004d2ca5e/w1_slave")
    text = tfile.read()
    tfile.close()
    temperature = text



    tfile2 = open("/sys/bus/w1/devices/28-000004d2fb20/w1_slave")
    text2 = tfile2.read()
    tfile2.close()
    temperature2 = text2


    tfile3 = open("/sys/bus/w1/devices/28-000004d30568/w1_slave")
    text3 = tfile3.read()
    tfile3.close()
    temperature3 = text3



    textfile = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave1", "w ")
    textfile2 = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave2", "w ")
    textfile3 = open("/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave3", "w ")
    temperature = str(temperature)
    temperature2 = str(temperature2)
    temperature3 = str(temperature3)
    textfile.write(temperature)
    textfile2.write(temperature2)
    textfile3.write(temperature3)
    textfile.close()
    textfile2.close()
    textfile3.close()
    print temperature
    print temperature2
    print temperature3
    time.sleep(3)

 except:
  pass

我添加了异常传递,因为即使它得到错误的值,我也需要它继续运行。当其中一个温度计断开连接时,python 试图读取的文件是空白的,但仍然存在。

4

2 回答 2

4

除去毯子除外。

您的脚本没有冻结,但是您遇到的任何错误都会在无限循环中被忽略。因为您使用毯子,所以您except:可以捕获所有异常,包括键盘中断异常KeyboardInterrupt

至少记录异常,并仅捕获Exception

except Exception:
    import logging
    logging.exception('Oops: error occurred')

KeyboardInterrupt是 的子类BaseException,不会Exception也不会被 this except 处理程序捕获。

看看复制文件的shutil模块,你做的工作太多了:

import time
import shutil
import os.path

paths = ('28-000004d2ca5e', '28-000004d2fb20', '28-000004d30568')

while True:
    for i, name in enumerate(paths, 1):
        src = os.path.join('/sys/bus/w1/devices', name, 'w1_slave')
        dst = '/home/pi/ComScriptPi/profiles/Temperature_parse/w1_slave{}'.format(i)
        try:
            shutil.copyfile(src, dst)
        except EnvironmentError:
            import logging
            logging.exception('Oops: error occurred')

    time.sleep(3)

处理文件只应引发或其EnvironmentError子类,无需在此处捕获所有内容。

于 2013-07-29T21:22:41.740 回答
0

拔出设备的打开很可能是阻塞的,因为如果设备不存在,设备驱动程序将不会打开。

您需要使用 os.open ,它相当于 Unix 系统调用“open”,并指定标志 O_NONBLOCK 并检查返回码。然后,您可以使用 os.fdopen 将 os.open 的返回值转换为普通的 Python 文件对象。

于 2013-07-29T21:32:07.733 回答