0

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 は、ブロッキングがオフの場合でもコードをブロックします」です。どちらの回答も喜んで受け入れます。

助けてくれてありがとう、本当に感謝しています。

4

1 に答える 1

0

Pylirc2 に切り替えてpylirc.blocking (0)を使用すると修正されました。

于 2014-10-18T05:01:59.233 に答える