Python Rohrleitungen unter Windows: Warum funktioniert das nicht?
Frage
Ich bin so etwas wie diese versuchen,
Output.py
print "Hello"
Input.py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
In der cmd Zeile
Output.py | Input.py
Aber es gibt ein EOFError . Kann mir jemand sagen, was ich falsch mache?
Danke für Ihre Hilfe.
Bearbeiten
Patrick Harrington Lösung funktioniert, aber ich don‘ t wissen, warum ...
Lösung
Getestet habe ich diese auf meinem Windows-Rechner 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 erhalte eine EOFError auch wenn die Befehle direkt als ausgeführt wird:
output.py | input.py
ich genau bin nicht sicher, warum das so ist, suche ich noch in dieser ein, aber zumindest sollte man mit einer Abhilfe für jetzt zur Verfügung stellen. Es kann etwas mit der Art und Weise zu tun hat, die Datei-Handler für .py Dateien aufgerufen werden.
UPDATE : na ja, was tun Sie wissen. Sieht aus wie dies tatsächlich ein Fehler in Windows ist, wo stdin / stdout Umleitung nicht richtig funktionieren kann, wenn sie von einer Dateizuordnung gestartet. So ist die Abhilfe ist, wie von mir und Patrick erwähnt, müssen Sie angeben, „Python“ wird input.py laufen, sonst wird es nicht stdout von output.py zum stdin für input.py richtig umleiten.
Referenz :
http: //mail.python .org / pipermail / python-Fehler-Liste / 2004-August / 024923.html
http://support.microsoft.com/default.aspx?kbid = 321.788
UPDATE 2 :
Um dieses Verhalten zu ändern und Windows Rohre funktioniert wie für stdin / stdout Umleitung erwartet Sie diesen Wert in der Registrierung hinzufügen kann (getestet auf meiner Box und überprüft dies funktioniert wie gewünscht).
- Starten Sie den Registrierungs-Editor.
Suchen Sie und klicken Sie dann auf den folgenden Schlüssel in der Registrierung:
HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ Currentversion \ Policies \ Explorer
Auf dem Menü Bearbeiten auf Wert hinzufügen, und fügen Sie den folgenden Registrierungswert:
Wertname: InheritConsoleHandles
Datentyp: REG_DWORD
Basis: Dezimal
Wertdaten: 1Registrierungs-Editor beenden.
Andere Tipps
Ändern Sie es an:
Output.py | python Input.py
Der Ausgang wird sein:
Geben Sie mir den Gruß. Die Begrüßung ist: Hallo
Hier ist, warum Sie die EOFError (aus der Dokumentation auf raw_input) erhalten:
Die Funktion liest dann eine Zeile aus Eingang, wandelt es in einen String (Strippen ein nachlauf Neue-Zeile), und kehrt das. Wenn EOF gelesen wird, EOFError angehoben wird.
http://docs.python.org/library/functions .html? highlight = raw_input # raw_input
Sie möchten verwenden sys.stdin , es bietet 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()