Python LIRC阻塞信号解决方法无法正常工作

时间:2014-10-18 00:42:22

标签: python exception-handling signals alarm lirc

我一直遇到 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 ”,这就是此解决方法的用途。我很乐意接受答案。

提前感谢您提供任何帮助,我们非常感谢。

1 个答案:

答案 0 :(得分:0)

切换到 Pylirc2 并使用 pylirc.blocking(0)修复它。