我一直有Python LIRC函數lirc.nextcode()的問題。我關掉阻擋,這允許代碼lirc.nextcode()待如果LIRC隊列是空的,通過用lirc.init初始化跳過(「節目」,阻斷=假)並試圖-LIRC。 set_blocking(False,sockid)。這兩者都無法工作,並且代碼會一直掛起,等待按鈕按下時,它應該繼續。Python LIRC阻止信號解決方法不起作用
我發現此解決方案在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隊列,它應該打印在按鈕PR essed。如果沒有按鈕被按下並且隊列爲空,則它應該打印「提示超時,繼續...」和「超時」。
實際發生的:如果一個按鈕被按下和IR代碼是在LIRC隊列它打印按鈕,但如果沒有按鈕被按下,隊列爲空它掛起,直到我關閉它。
它的工作原理完全如預期,直到我改變文本的raw_input =(提示)到文本= 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()不起作用,而且還會阻止信號報警代碼解決方法繼續。
這裏是一個鏈接「Python Lirc blocks code even when blocking is off」我就LIRC阻塞,而這正是這個解決方法是對原來的問題。我很樂意接受任何一個答案。
感謝您提前幫助,非常感謝。