Python LIRC関数lirc.nextcode()に問題があります。ブロッキングをオフにしました。これにより、LIRCキューが空の場合にコードlirc.nextcode()をスキップできます。これには、 lirc.init("program", blocks=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キューが空である場合は、"Prompt timeout. Continueing..." および "timed out" を出力する必要があります。
実際に何が起こるか:ボタンが押され、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 は、ブロッキングがオフの場合でもコードをブロックします」です。どちらの回答も喜んで受け入れます。
助けてくれてありがとう、本当に感謝しています。