2011-11-07 16 views
7

podobne pytanie zostało zadane before, ale odpowiedzi sugerowały obejście, które nie ma zastosowania w mojej sytuacji.Python raw_input after sys.stdin.read() wyrzuca EOFError

Wiadomość e-mail jest wyprowadzony z mutt do skryptu, i są odczytywane ze standardowego wejścia:

message = sys.stdin.read() 
# message is parsed and URLs are printed as a list to choose from... 
selected_index = raw_input('Which URL to open?') 

Rozumiem, że raw_input() otrzyma EOF pozostawioną przez read(), ale czy jest jakiś sposób, aby "zresetować" STDIN?

+0

Jakiego systemu używasz? W Linuksie działa to dobrze! –

+0

Mac OS X (10.7). Alex Martelli zasugerował ponowne otwarcie STDIN [tutaj] (http://stackoverflow.com/questions/2197891/how-to-handle-eoferror-for-raw-input-in-python-in-mac-os-x), ale to nie działa dla mnie. – janeden

+0

Właśnie potwierdziłem, że ten sam wyjątek jest generowany w systemie GNU/Linux (CentOS). Kiedy ręcznie podaję STDIN (kończąc wejście za pomocą CTRL-D), skrypt działa poprawnie, ale wywołanie './script.py janeden

Odpowiedz

5

Czy próbowałeś to:

message = sys.stdin.read() 
sys.stdin = open('/dev/tty') 
selected_index = raw_input('Which URL to open?') 

To działa na Linux; może to też zadziała dla OSX.

+0

Niestety, to nie działa (jest to rozwiązanie proponowane dla pytania, które łączyłem w moim pierwszym poście). W zmodyfikowanej formie skrypt czeka na dane wejściowe ** przed ** pojawieniem się funkcji raw_input, a błąd pojawia się, gdy uderzę return. – janeden

+0

To dziwne - musiałem zrobić coś złego przedtem: To działa teraz. Dzięki! – janeden

+0

Fajny hack! Linux FTW – g33kz0r

0

Spróbuj zresetować STDIN użyciu sys.stdin.seek(0)

referencyjny: http://docs.python.org/library/fileinput.html

+0

To pomaga nieco - wyjątek EOFError zniknął, ale raw_input jest teraz całkowicie ignorowany (tzn. Skrypt kontynuuje działanie bez czekania na wprowadzenie danych przez użytkownika). – janeden

Powiązane problemy