2009-01-21 6 views
11

Ich versuche, so etwas wie diesesPython-Piping unter Windows: Warum funktioniert das nicht?

Output.py

print "Hello" 

Input.py

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

Am cmd Linie

Output.py | Input.py 

Aber es gibt ein EOFError. Kann mir jemand sagen, was ich falsch mache?

Danke für Ihre Hilfe.

EDIT
Patrick Harrington solution funktioniert, aber ich weiß nicht, warum ...

+0

Dies funktioniert in Python 3.0. –

+0

Das heißt, ich verwendete Eingabe (..) anstelle von Raw_Input (..) –

+0

Ich habe meine Antwort aktualisiert, um zu erklären, warum die Lösung Patrick und ich schlug vor, funktioniert und das Original nicht. – Jay

Antwort

23

ich diese auf meinem Windows-Rechner getestet und es funktioniert, wenn Sie den Python exe angeben:

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

Aber ich bekomme einen EOFError auch, wenn ich die Befehle direkt als ausführen:

output.py | input.py 

Ich bin mir nicht sicher, warum genau das ist, ich schaue immer noch in dieses Thema, aber zumindest sollte dir das jetzt einen Workaround bieten. Es hat möglicherweise etwas damit zu tun, wie der Dateihandler für .py-Dateien aufgerufen wird.

UPDATE: nun, was weißt du. Sieht aus, als wäre dies ein Fehler in Windows, bei dem die stdin/stdout-Umleitung möglicherweise nicht richtig funktioniert, wenn sie von einer Dateiassoziation gestartet wird. So ist die Problemumgehung wie von mir und Patrick bemerkt, Sie müssen angeben, dass "python" input.py ausführen wird, andernfalls wird stdout von output.py nicht korrekt in die stdin für input.py umgeleitet.

Referenz:

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

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

UPDATE 2:

Um dieses Verhalten zu ändern und Windows Rohre wie erwartet arbeiten stdin/stdout redirection, Sie können diesen Wert der Registrierung hinzufügen (getestet auf meiner Box und verifiziert, das funktioniert wie gewünscht).

  1. Starten Sie den Registrierungseditor.
  2. Suchen Sie und klicken Sie dann auf den folgenden Schlüssel in der Registrierung:

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Currentversion \ Policies Explorer \

  3. Auf dem Menü Bearbeiten auf Wert hinzufügen, und dann fügen Sie den folgenden Wert Registrierung:

    Wertname: InheritConsoleHandles
    Datentyp: RE G_DWORD
    Basis: Dezimal
    Wertdaten: 1

  4. Beenden Sie den Registrierungseditor.

+1

Es ist erwähnenswert, dass Sie jetzt 'InheritConsoleHandles' Wert zur Windows-Registrierung hinzufügen können, um' output.py | zu verwenden input.py' wie auf der verknüpften Seite von Microsoft.com beschrieben. – jfs

+0

guter Punkt, wird – Jay

4

Ändern Sie es an:

Output.py | python Input.py 

Der Ausgang wird sein:

Gib mir den Gruß. Die Begrüßung ist: hallo

+0

tun, warum funktioniert das, aber Python auslassen macht es nicht funktioniert? – Nope

+0

Sehen Sie meine Antwort für den Grund, warum das funktioniert. – Jay

0

Hier ist, warum Sie die EOFError erhalten (aus der Dokumentation auf raw_input):

Die Funktion liest dann eine Linie von Eingang, wandelt es in einen String (Stripping einer abschließende Newline), und gibt das zurück. Wenn EOF gelesen wird, wird EOFError ausgelöst.

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

Sie möchten sys.stdin verwenden, bietet es ein Dateiobjekt, von dem Sie die Lese verwenden können, Methoden readlines.

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