我正在使用python脚本将三个文件的内容传输到另外三个文件。原始文件是我连接到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尝试读取的文件是空白的,但仍然存在。
答案 0 :(得分:4)
除去以外的毯子。
你的脚本不冻结,但你得到的任何错误都会在无限循环中被忽略。由于您使用了except:
毯子,因此可以捕获所有例外,包括键盘中断例外KeyboardInterrupt
。
至少记录例外,并且仅捕获Exception
:
except Exception:
import logging
logging.exception('Oops: error occurred')
KeyboardInterrupt
是BaseException
的子类,而不是Exception
,除了处理程序之外,不会被此捕获。
看看shutil
module复制文件,你做的工作太多了:
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
或它的子类,没有需要抓住这里的所有内容。
答案 1 :(得分:0)
未插入设备的打开很可能会阻塞,因为如果设备不存在,设备驱动程序将无法打开。
你需要使用os.open,这相当于Unix系统调用“open”,并指定标志O_NONBLOCK并检查返回码。然后,您可以使用os.fdopen将os.open的返回值转换为普通的Python文件对象。