Python LIRC 阻塞信号解决方法无效

0 投票
1 回答
671 浏览
提问于 2025-04-28 05:24

我在使用Python LIRClirc.nextcode()函数时遇到了一些麻烦。我关闭了阻塞功能,这样如果LIRC的队列是空的,代码lirc.nextcode()就可以跳过。我是通过lirc.init("program", blocking=False)来初始化的,还尝试了lirc.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队列中有红外代码,它应该打印出被按下的按钮。如果没有按下按钮,并且LIRC队列是空的,它应该打印“提示超时。继续...”和“超时”。

实际发生的情况:如果按下了按钮,并且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阻塞的原始问题,这个解决方法就是为了解决这个问题。如果有答案我会很高兴接受。

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

暂无标签

1 个回答

0

换用Pylirc2并使用pylirc.blocking(0)解决了这个问题。

撰写回答