2012-04-04 10 views
10

sys.stdout Ich bin auf Windows und Python ist (sehr effektiv) verhindert mich von einem eigenständigen '\n' Charakter zu STDOUT sendet. Zum Beispiel kann der folgende Wille Ausgang foo\r\nvar:stoppt einen Wagenrücklauf zu emittieren, wenn neue Zeilen zu schreiben

sys.stdout.write("foo\nvar") 

Wie kann ich mich wenden dieses „Feature“ aus? Das erste Schreiben in eine Datei ist keine Option, da die Ausgabe piped ist.

+4

Welcher Code verwenden Sie derzeit? – Amber

+0

Mit welchem ​​sys.stdout auch immer geöffnet wird. –

+1

Ich meinte, was benutzt du, um es zu schreiben? "drucken"? 'sys.stdout.write()'? – Amber

Antwort

11

Versuchen Sie folgendes, bevor irgendetwas zu schreiben:

import sys 

if sys.platform == "win32": 
    import os, msvcrt 
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) 

Wenn Sie nur vorübergehend in den Binärmodus ändern möchten, können Sie sich einen Wrapper schreiben:

import sys 
from contextlib import contextmanager 

@contextmanager 
def binary_mode(f): 
    if sys.platform != "win32": 
     yield; return 

    import msvcrt, os 
    def setmode(mode): 
     f.flush() 
     msvcrt.setmode(f.fileno(), mode) 

    setmode(os.O_BINARY) 
    try: 
     yield 
    finally: 
     setmode(os.O_TEXT) 

with binary_mode(sys.stdout), binary_mode(sys.stderr): 
    # code 
+0

Ja, das habe ich gerade auch gefunden. –

+0

@John: 4 Sekunden Unterschied: D Raten wir beide die gleichen Begriffe verwendet;) –

+0

„Das war das Ergebnis einer sehr schnellen Google-Suche“, erst nachdem ich die Frage so formuliert, wie die Suche zu erleichtern. Ich hatte ungefähr eine Stunde damit verbracht, nach "make python stop emitation carriage return" zu suchen, und so kam ich hierher. –

-4

Add 'r' before the string:

sys.stdout.write(r"foo\nvar") 

Wie erwartet, es funktioniert auch für den Druck.

+0

Ahm, wird es den umgekehrten Schrägstrich und die n buchstäblich drucken? –

Verwandte Themen