我一直遇到 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(提示)更改为 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()不起作用,但它也会阻止信号警报代码解决方法继续进行。
以下是关于 LIRC 阻止的原始问题的链接“ Python Lirc blocks code even when blocking is off ”,这就是此解决方法的用途。我很乐意接受答案。
提前感谢您提供任何帮助,我们非常感谢。
答案 0 :(得分:0)
切换到 Pylirc2 并使用 pylirc.blocking(0)修复它。