2012-04-04 12 views
10

Sono su Windows e Python è (in modo molto efficace) che impedisce di inviare un carattere standalone '\n' a STDOUT. Ad esempio, il seguente output volontà foo\r\nvar:Interruzione in Python di un ritorno a capo durante la scrittura di newlines su sys.stdout

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

Come posso trasformare questa "funzione" off? Scrivere prima su un file non è un'opzione, perché l'output viene sottoposto a pipe.

+4

Quale codice stai attualmente utilizzando? – Amber

+0

Qualunque sia l'apertura di sys.stdout. –

+1

Intendevo cosa stai usando per scrivere su di esso? 'Print'? 'Sys.stdout.write()'? – Amber

risposta

11

tentare di risolverli prima di scrivere qualsiasi cosa:

import sys 

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

Se si desidera solo per passare alla modalità binaria temporaneo, è possibile scrivere voi stessi un avvolgitore:

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

Sì, l'ho trovato anche io. –

+0

@John: 4 secondi di differenza: D Immagino entrambi abbiamo usato gli stessi termini di ricerca;) –

+0

"questo era il risultato di una ricerca Google molto rapida", solo dopo aver formulato la domanda in modo tale da facilitare la ricerca. Avevo passato circa un'ora cercando "make python stop emiting carriage return", e così sono venuto qui. –

-4

Add 'r' before the string:

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

Come previsto, funziona anche per la stampa.

+0

Ah, stamperà letteralmente la barra rovesciata e la n? –

Problemi correlati