64 Stimmen

Windows-Python von Cygwin aus verwenden

Ich benutze seit kurzem Cygwin unter Windows. Ich möchte die Windows-Installation von Python verwenden, also benutze ich beim Testen /cygdrive/c/Python26/python.exe myfile.py statt python myfile.exe .

Das funktioniert fast perfekt, außer beim Drucken. Wenn ich das Windows-Python von Cygwin aus ausführe, wird die Ausgabe nicht gedruckt, bis die Ausführung beendet ist. Es funktioniert gut, wenn ich Windows-Python über explorer.exe oder cmd.exe ausführe, und es funktioniert in Cygwin mit dem in Cygwin installierten Python ( /bin/python.exe ).

Gibt es eine Lösung für dieses Problem? Das Wichtigste ist, dass ich die Windows-Version ausführen kann, aber ich würde gerne alles mit der Bash machen.

1 Stimmen

Haben Sie versucht, die bash.exe von einer DOS-Eingabeaufforderung aus zu starten? Ich denke, dies wird Ihre Probleme lösen, ohne dass Sie die Option -i oder die Variable PYTHONUNBUFFERED verwenden müssen. Lassen Sie mich wissen, ob es bei Ihnen funktioniert.

0 Stimmen

120voto

noisygecko Punkte 1731

Das eigentliche Problem ist, dass die Cygwin-Terminalprogramme wie mintty nicht als Windows-Konsolen fungieren, wenn Sie einen Befehl ausführen. Das tun nur die Windows-Konsolenprogramme wie CMD oder Console2. Mit Cygwin-Terminals denkt die Windows python.exe also nicht, dass sie mit einer interaktiven Konsole spricht.

Das führt dazu, dass die Ausgabe gepuffert wird, anstatt die Puffer bei jeder Zeile zu leeren, wie es bei interaktiven Sitzungen der Fall ist. Deshalb behebt Amros Hinzufügen von flush() in jeder Zeile das Symptom, bedeutet aber eine Änderung des Codes.

Eine Lösung, ohne den Code zu ändern, besteht darin, die Pufferung in Python mit dem Flag '-u' auf der Befehlszeile oder durch Setzen der Umgebungsvariablen PYTHONUNBUFFERED zu deaktivieren.

export PYTHONUNBUFFERED=1

/cydrive/c/Python27/python.exe foo.py

ou

/cydrive/c/Python27/python.exe -u foo.py

oder im interaktiven Modus ausführen

/cydrive/c/Python27/python.exe -i foo.py

Sie werden auch nicht in der Lage sein, den interaktiven Modus von Windows python.exe im Cygwin-Terminal auszuführen. Es wird keine interaktive Sitzung gestartet, sondern bleibt einfach hängen. Die beste Lösung scheint mir die Verwendung von "cygstart" zu sein (besser als die Verwendung der Option "-i"):

cygstart /cygdrive/c/Python27/python.exe

Und das scheint auch mit ipython zu funktionieren (falls installiert):

cygstart /cygdrive/c/Python27/Scripts/ipython.exe

42voto

Timur Punkte 11272

Dies ist keine Antwort auf die ursprüngliche Frage, aber für diejenigen, die die Interaktive Python-Sitzung vom Cygwin-Terminal aus (z.B. in mintty) - starten Sie Python mit der Option "-i", um ihm ausdrücklich mitzuteilen, dass es im interaktiven Modus laufen soll:

$ python -i

Der elegante Weg ist auch, einen Alias in Ihrer .bashrc zu erstellen (in dem Wissen, dass sie ohnehin nur für interaktive Terminalsitzungen gelesen wird):

alias python='python -i'

Andernfalls weiß Python nicht, dass es in der Konsole läuft, da alle Cygwin pty-basierten Terminals (mintty, rxvt und xterm) von Windows als Pipes und nicht als Konsole erkannt werden. Daher denkt Python, dass es keine Konsole gibt und wechselt in den nicht-interaktiven Modus. Wenn Sie stattdessen den interaktiven Modus wünschen, müssen Sie Python explizit sagen, dass es diesen verwenden soll. Allerdings verhält sich Python dann immer noch nicht so, wie es normalerweise sein sollte - man kann dann immer noch nicht die HOME- oder LINKS-Pfeiltasten benutzen, usw.

24voto

Amro Punkte 122495

Vielleicht sollten Sie die Ausgabe spülen

import sys

V = range(100000)
for x in V:
    print x
    sys.stdout.flush()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X