2014-10-18 26 views
0

我一直有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阻塞,而這正是這個解決方法是對原來的問題。我很樂意接受任何一個答案。

感謝您提前幫助,非常感謝。

回答

0

切換到Pylirc2並使用pylirc.blocking(0)固定它。