Piping Python su Windows: perché questo non funziona?
Domanda
Sto provando qualcosa del genere
Output.py
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
Alla riga cmd
Output.py | Input.py
Ma restituisce un errore EOFE . Qualcuno può dirmi cosa sto facendo di sbagliato?
Grazie per il tuo aiuto.
MODIFICA
Patrick Harrington soluzione funziona ma io non non so perché ...
Soluzione
L'ho provato sul mio computer Windows e funziona se specifichi Python exe:
C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello
Ma ottengo un errore EOFE anche se eseguo i comandi direttamente come:
output.py | input.py
Non sono sicuro del perché esattamente, sto ancora esaminando questo, ma almeno questo dovrebbe fornirti una soluzione alternativa per ora. Potrebbe avere qualcosa a che fare con il modo in cui il gestore di file viene invocato per i file .py.
AGGIORNAMENTO : bene, cosa sai. Sembra che questo sia in realtà un bug in Windows in cui il reindirizzamento stdin / stdout potrebbe non funzionare correttamente quando avviato da un'associazione di file. Quindi la soluzione alternativa è come ho notato io e Patrick, è necessario specificare "python" eseguirà input.py, altrimenti non reindirizzerà stdout da output.py allo stdin per input.py correttamente.
Riferimento :
http: //mail.python .org / pipermail / python-bugs-list / 2004-August / 024923.html
http://support.microsoft.com/default.aspx?kbid = 321.788
AGGIORNAMENTO 2 :
Per modificare questo comportamento e far funzionare le pipe di Windows come previsto per il reindirizzamento stdin / stdout, puoi aggiungere questo valore al registro (testato sulla mia scatola e verificato che funzioni come desiderato).
- Avvia l'editor del registro.
Individua e quindi fai clic sulla seguente chiave nel registro:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer
Dal menu Modifica, fare clic su Aggiungi valore, quindi aggiungere quanto segue valore del registro:
Nome valore: InheritConsoleHandles
Tipo di dati: REG_DWORD
Radix:
decimale Dati valore: 1Chiudi l'editor del registro.
Altri suggerimenti
Modificalo in:
Output.py | python Input.py
L'output sarà:
Dammi il saluto. Il saluto è: ciao
Ecco perché ottieni EOFError (dalla documentazione su raw_input):
La funzione quindi legge una riga da input, lo converte in una stringa (spogliando una nuova riga finale), e restituisce quello. Quando viene letto EOF, EOFError viene generato.
http://docs.python.org/library/functions .html? evidenziare = raw_input # raw_input
Potresti voler usare sys.stdin , fornisce un oggetto file dal quale puoi usare i metodi read, readlines.
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()