2014-09-17 1 views
0

Я не могу понять, как избежать EOFError на второй итерации цикла while сразу после запроса raw_input. Мне нужно, чтобы этот цикл выполнялся 30 раз и в идеале не имел бы блок try-except, который загружал бы меня из программы. Любая помощь будет оценена! `Python EOFError во время цикла при использовании raw_input

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 

`

+0

Вы смешиваете использование 'sys.stdin.read()' и 'raw_input'. Я предполагаю, что после 'read()', 'stdin' станет пустым, а' raw_input' выбрасывает EOFError. – 2014-09-17 07:37:47

ответ

0

Вы пробовали construcing минимальный рабочий пример, который воспроизводит ошибку? Я запускаю python на окнах, поэтому я не могу попробовать все, что вы делаете, поскольку fcntl является специфичным для UNIX, но я бы предложил начать удаление части вашего кода (например, чтение и воспроизведение файла) до тех пор, пока ошибка не исчезнет.

Кроме того, вы открываете файлы и потоки, но не закрываете их явно, например. вы звоните stream = p.open(...), но нет stream.stop_stream() и stream.close(), а также нет wf.close(). Вероятно, это не связано с вашей ошибкой, но рекомендуется закрывать файлы и не полагаться на сборку мусора.