我在使用Python LIRC函数LIRC.nextcode()时遇到了问题。我关闭了阻塞,如果LIRC队列为空,则可以跳过代码LIRC.nextcode,方法是使用LIRC.init("program",blocking=False)进行初始化,并尝试li rc.set_blocking(False,sockid) 我发现了这个解决方法,它对raw_input('prompt')设置了时间限制。因此,即使我的lirc.nextcode()等待按下按钮,如果没有按下按钮来解除警报,警报将在5秒钟后熄灭,并且无论如何都会跳过代码: 然后根据我的需要进行了更改: 我希望发生的事情:如果按下了按钮,并且LIRC队列中有IR代码,它应该打印按下的按钮。如果没有按下任何按钮,并且LIRC队列为空,则应打印"提示超时。正在继续…"one_answers"超时"。 实际发生的情况:如果按下了一个按钮,并且IR代码在LIRC队列中,它会打印按钮,但如果没有按下任何按钮,并且队列为空,它会挂起,直到我关闭它。 因此,关闭lirc.nextcode()的阻塞不仅不起作用,而且还会阻止Signal报警代码的解决方法继续运行。 这里有一个链接"Python Lirc即使在阻塞关闭时也会阻塞代码",链接到我最初关于Lirc阻塞的问题,这就是这个解决方法的目的。我很乐意接受任何一个答案。 提前感谢您的帮助,真的很感激。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()
它完全按照预期工作,直到我将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
切换到Pylirc2并使用pyirc.blocking(0)修复了它。