2009-01-21 18 views
11

Estoy intentando algo como estoTubería de Python en Windows: ¿Por qué esto no funciona?

Output.py

print "Hello" 

Input.py

greeting = raw_input("Give me the greeting. ") 
print "The greeting is:", greeting 

En la línea de cmd

Output.py | Input.py 

Pero devuelve un EOFError . ¿Puede alguien decirme qué estoy haciendo mal?

Gracias por su ayuda.

EDITAR
Patrick Harrington solution obras, pero no sé por qué ...

+0

Esto funciona en Python 3.0. –

+0

Es decir, utilicé input (..) en lugar de raw_input (..) –

+0

He actualizado mi respuesta para explicar por qué la solución que propuse Patrick y yo funciona y la original no. – Jay

Respuesta

23

He probado esto en mi máquina de Windows y funciona si se especifica el exe Python:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py 
Give me the greeting. The greeting is: hello 

Pero también recibo un EOFError si ejecuto los comandos directamente como:

output.py | input.py 

No estoy seguro exactamente de por qué es así, todavía estoy investigando esto, pero al menos esto debería proporcionarle una solución por ahora. Puede tener algo que ver con la forma en que se invoca el manejador de archivos para los archivos .py.

ACTUALIZACIÓN: bueno, ¿qué sabes tú? Parece que esto es realmente un error en Windows donde la redirección stdin/stdout puede no funcionar correctamente cuando se inicia desde una asociación de archivos. Entonces, la solución es la que hemos señalado Patrick y yo, debe especificar que "python" ejecutará input.py, de lo contrario no redireccionará stdout de output.py a stdin para input.py correctamente.

Referencia:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

ACTUALIZACIÓN 2:

Para cambiar este comportamiento y hacer tubos de Windows funcionan como se esperaba para redirección stdin/stdout, puede agregar este valor al registro (probado en mi cuadro y verificado que funciona como desee).

  1. Iniciar el Editor del Registro.
  2. Busque y haga clic en la siguiente clave del registro:

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer

  3. En el menú Edición, haga clic en Agregar valor y, a continuación, agregue el siguiente valor del registro :

    nombre

    valor: InheritConsoleHandles tipo
    datos: RE G_DWORD
    Base: decimal
    valor: 1

  4. Editor del Registro.

+1

Vale la pena mencionar que ahora puede agregar el valor 'InheritConsoleHandles' al registro de Windows para usar' output.py | input.py' como se describe en la página enlazada de microsoft.com. – jfs

+0

buen punto, va a hacer – Jay

4

Cambiar a:

Output.py | python Input.py 

La salida será:

Dame el saludo. El saludo es: hola

+0

¿por qué funciona esto pero dejar de lado a python hace que no funcione? – Nope

+0

Consulte mi respuesta para conocer el motivo por el que esto funciona. – Jay

0

He aquí por qué se obtiene la EOFError (a partir de la documentación sobre raw_input):

La función lee entonces una línea de de entrada, lo convierte en una cadena (stripping una trailing newline) y lo devuelve. Cuando se lee EOF, se genera EOFError.

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

Es posible que desee utilizar sys.stdin, que proporciona un objeto de archivo desde el que se puede utilizar la lectura, readlines métodos.

import sys 
for greeting_line in sys.stdin.readlines(): 
    print "The greeting is:", greeting_line.strip() 
Cuestiones relacionadas