我一直在使用Python LIRC函数lirc.nextcode()遇到问题。我关闭了阻塞,如果LIRC队列为空,则允许跳过代码lirc.nextcode() ,方法是使用lirc.init("program", blocking=False)进行初始化并尝试lirc.set_blocking(False, sockid)。两者都不起作用,代码总是挂起,等待按钮按下,当它应该继续时。
我发现这种解决方法对raw_input('prompt')设置了时间限制。因此,即使我的lirc.nextcodde()等待按钮按下,如果没有按下按钮来停用警报,警报也会在 5 秒后响起,并且无论如何都会跳过代码:
import signal
class AlarmException(Exception):
pass
def alarmHandler(signum, frame):
raise AlarmException
def nonBlockingRawInput(prompt='', timeout=20):
signal.signal(signal.SIGALRM, alarmHandler)
signal.alarm(timeout)
try:
text = raw_input(prompt)
signal.alarm(0)
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal(signal.SIGALRM, signal.SIG_IGN)
return ''
然后改变它以满足我的需要:
import signal
import lirc
sockid = lirc.init('weather', blocking=False)
class AlarmException(Exception):
pass
def alarmHandler(signum, frame):
raise AlarmException
def nonBlockingRawInput(prompt='', timeout=5):
signal.signal(signal.SIGALRM, alarmHandler)
signal.alarm(timeout)
try:
text = lirc.nextcode()
signal.alarm(0)
print text
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal(signal.SIGALRM, signal.SIG_IGN)
print 'timed out'
return ''
nonBlockingRawInput()
我想要发生的事情:如果一个按钮被按下并且一个 IR 代码在LIRC队列中,它应该打印被按下的按钮。如果没有按下任何按钮并且LIRC队列为空,它应该打印“提示超时。继续...”和“超时”。
实际发生的情况:如果一个按钮被按下并且 IR 代码在LIRC队列中,它会打印该按钮,但如果没有按下任何按钮并且队列为空,它会挂起,直到我关闭它。
它完全按预期工作,直到我将text = raw_input(prompt)更改为text = lirc.nextcode(),然后它挂在该函数上,直到它关闭并给出此错误:
Traceback (most recent call last):
File "/home/pi/time.py", line 27, in <module>
nonBlockingRawInput()
File "/home/pi/time.py", line 16, in nonBlockingRawInput
text = lirc.nextcode()
File "/home/pi/time.py", line 10, in alarmHandler
raise AlarmException
__main__.AlarmException
因此,关闭lirc.nextcode()的阻塞不仅不起作用,而且还会阻止Signal警报代码解决方法继续进行。
这是我关于LIRC阻塞的原始问题的链接“ Python Lirc blocks code even when blocking is off ” ,这就是这个解决方法的用途。我很乐意接受任何一个答案。
提前感谢您的帮助,非常感谢。