0

raw_input を求めた直後の while ループの 2 回目の繰り返しで EOFError を回避する方法がわかりません。このループを 30 回実行する必要があり、理想的には、プログラムから起動する try-except ブロックはありません。どんな助けでも大歓迎です!

import sys
import pyaudio
import wave
import os
import fcntl
import time

def main():
    sound_cues = open('sound_cues').read().splitlines()
    light_cues = open('light_cues').read().splitlines()
    play_names = open('play_names').read().splitlines()
    plays = []

    for idx in range(len(play_names)):
        plays.append( {'name': play_names[idx], 'sound': sound_cues[idx], 'lights': light_cues[idx]} )

    while(True):
        play_num = raw_input("Enter a play number: ")

        play = plays[int(play_num) - 1]
        print
        print 'lights:'
        print play['lights']
        print
        raw_input("Press Enter to start sound...")
        print
        print 'sound:'
        print play['sound']

        audio = "sounds/" + play['sound']

        wf = wave.open(audio)
        p = pyaudio.PyAudio()
        stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels = wf.getnchannels(),
                rate = wf.getframerate(),
                output=True)

        data = wf.readframes(1024)
        fl = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL)
        fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
        print
        print "Press Enter to stop audio..."
        print
        while data != '':
            try:
                stdin = sys.stdin.read()
                if "\n" in stdin or "\r" in stdin:
                    break
            except IOError:
                pass
            stream.write(data)
            data = wf.readframes(1024)

if __name__ == "__main__":
    main()

`

出力は `

Enter a play number: 2

lights:
Black out, clamp light works as spot, follows Kris

Press Enter to start sound...

sound:
1.wav

Press Enter to stop audio...


Enter a play number: Traceback (most recent call last):
  File "30plays_1.py", line 56, in <module>
    main()
  File "30plays_1.py", line 18, in main
    play_num = raw_input("Enter a play number: ")
EOFError

`

4

1 に答える 1

0

エラーを再現する最小限の作業例を作成しようとしましたか? 私は Windows で python を実行しているので、fcntlUNIX 固有のように、実行していることすべてを試すことはできませんが、エラーが消えるまでコードの一部の削除 (ファイルの読み取りや再生など) を開始することをお勧めします。

また、ファイルとストリームを開いていますが、それらを明示的に閉じてはいけません。たとえば、 を呼び出していますが、 and もstream = p.open(...)noもありません。これはおそらくエラーとは関係ありませんが、ガベージ コレクションに頼らずにファイルを閉じることをお勧めします。stream.stop_stream()stream.close()wf.close()

于 2014-09-17T05:48:39.207 に答える