0

我一直在使用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(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警报代码解决方法继续进行。

这是我关于LIRC阻塞的原始问题的链接“ Python Lirc blocks code even when blocking is off ” ,这就是这个解决方法的用途。我很乐意接受任何一个答案。

提前感谢您的帮助,非常感谢。

4

1 回答 1

0

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

于 2014-10-18T05:01:59.233 回答