问题
I have a function to collect temperature (values from text files) which uses a partly predefined path. However, sometimes the path does not exist if the temperature sensor wasn't loaded (is disconnected). How can I set a condition or exception to skip a loop if a path is not available?
I wanted to use continue, but i have no idea what condition to set with it.
def read_all():
base_dir = '/sys/bus/w1/devices/'
sensors=['28-000006dcc43f', '28-000006de2bd7', '28-000006dc7ea9', '28-000006dd9d1f','28-000006de2bd8']
for sensor in sensors:
device_folder = glob.glob(base_dir + sensor)[0]
device_file = device_folder + '/w1_slave'
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
回答1:
Use os.path.isfile and os.path.isdir() to check.
for sensor in sensors:
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
....
回答2:
I'm not sure why you are using subprocess.Popen to read the file. Why not just open() it and read()?.
A python way to handle missing dir or file is something like this:
for sensor in sensors:
try:
device_folder = glob.glob(base_dir + sensor)[0]
device_file = device_folder + '/w1_slave'
with open(device_file) as fd: # auto does fd.close()
out = fd.read()
except (IOError,IndexError):
continue
out_decode = out.decode('utf-8')
...
If you want to avoid hanging in open() or read() you can add a signal handler
and give yourself an alarm signal after, say, 5 seconds. This will interrupt
the function, and move you into the except
clause.
Setup the signal handler at the start:
import signal
def signal_handler(signal, frame):
raise IOError
signal.signal(signal.SIGALRM, signal_handler)
and modify your loop to call alarm(5)
before the part that might hang.
Call alarm(0) at the end to cancel the alarm.
for sensor in sensors:
signal.alarm(5)
try:
device_file = ...
with open(device_file) as fd:
out = fd.read()
except (IOError,IndexError):
continue
finally:
signal.alarm(0)
print "ok"
...
来源:https://stackoverflow.com/questions/32269775/python-raspberry-pi-if-path-doesnt-exist-skip-the-loop