Python LIRC阻止信号解决方法不起作用



我在使用Python LIRC函数LIRC.nextcode()时遇到了问题。我关闭了阻塞,如果LIRC队列为空,则可以跳过代码LIRC.nextcode,方法是使用LIRC.init("program",blocking=False)进行初始化,并尝试li rc.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队列中有IR代码,它应该打印按下的按钮。如果没有按下任何按钮,并且LIRC队列为空,则应打印"提示超时。正在继续…"one_answers"超时"。

实际发生的情况:如果按下了一个按钮,并且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报警代码的解决方法继续运行。

这里有一个链接"Python Lirc即使在阻塞关闭时也会阻塞代码",链接到我最初关于Lirc阻塞的问题,这就是这个解决方法的目的。我很乐意接受任何一个答案。

提前感谢您的帮助,真的很感激。

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

最新更新