Python LIRC 阻塞信号解决方法无效
我在使用Python LIRC的lirc.nextcode()函数时遇到了一些麻烦。我关闭了阻塞功能,这样如果LIRC的队列是空的,代码lirc.nextcode()就可以跳过。我是通过lirc.init("program", blocking=False)来初始化的,还尝试了lirc.set_blocking(False, sockid)。但这两种方法都没有效果,代码总是卡住,等待按钮按下,而应该继续执行。
我找到了一种解决方法,可以给raw_input('prompt')设置一个时间限制。这样即使我的lirc.nextcode()在等待按钮按下,如果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()
我想要的结果:如果按下了按钮,并且LIRC队列中有红外代码,它应该打印出被按下的按钮。如果没有按下按钮,并且LIRC队列是空的,它应该打印“提示超时。继续...”和“超时”。
实际发生的情况:如果按下了按钮,并且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警报代码的解决方法继续执行。
这里有一个链接“Python Lirc即使在关闭阻塞时也会阻塞代码”,这是我关于LIRC阻塞的原始问题,这个解决方法就是为了解决这个问题。如果有答案我会很高兴接受。
提前感谢任何帮助,真的很感激。
1 个回答
换用Pylirc2并使用pylirc.blocking(0)解决了这个问题。