2011-11-07 13 views
7

a una domanda simile è stato richiesto before, ma le risposte suggerivano una soluzione alternativa che non è applicabile alla mia situazione.Python raw_input seguente sys.stdin.read() genera EOFError

Un messaggio di posta elettronica è convogliato da mutt a uno script, e viene letto da STDIN:

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?') 

Capisco che raw_input() otterrà l'EOF data da read(), ma c'è un modo per 'resettare' STDIN?

+0

Quale sistema stai? Su Linux, questo funziona bene! –

+0

Mac OS X (10.7). Alex Martelli ha suggerito di riaprire STDIN [qui] (http://stackoverflow.com/questions/2197891/how-to-handle-eoferror-for-raw-input-in-python-in-mac-os-x), ma non sembra funzionare per me. – janeden

+0

Ho appena confermato che la stessa eccezione viene lanciata su un sistema GNU/Linux (CentOS). Quando invio manualmente STDIN (terminando l'input con CTRL-D), lo script funziona bene, ma chiamando './script.py janeden

risposta

5

Hai provato questo:

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

Questo funziona su Linux; forse funzionerà anche per OSX.

+0

Sfortunatamente, non funziona (questa è la soluzione proposta per la domanda a cui mi sono collegato nel mio primo post). Nel modulo modificato, lo script attende l'input ** before ** che arriva alla funzione raw_input e l'errore si verifica una volta che ho premuto return. – janeden

+0

Questo è strano - Devo aver fatto qualcosa di sbagliato prima: Funziona ora. Grazie! – janeden

+0

Bel trucco! Linux FTW – g33kz0r

0

provare a reimpostare STDIN utilizzando sys.stdin.seek(0)

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

+0

Questo aiuta un po '- l'eccezione EOFError è scomparsa, ma raw_input è ora completamente ignorato (vale a dire che lo script procede senza attendere l'input dell'utente). – janeden