Deshabilitar el almacenamiento en búfer de salida

Resuelto Eli Bendersky asked hace 15 años • 16 respuestas

¿El almacenamiento en búfer de salida está habilitado de forma predeterminada en el intérprete de Python para sys.stdout?

Si la respuesta es positiva, ¿cuáles son todas las formas de desactivarlo?

Sugerencias hasta el momento:

  1. Utilice el -uinterruptor de línea de comando
  2. Envolver sys.stdouten un objeto que se vacía después de cada escritura.
  3. Establecer PYTHONUNBUFFEREDvar de entorno
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

¿ Hay alguna otra forma de establecer algún indicador global en sys/ sys.stdoutmediante programación durante la ejecución?


Si solo desea vaciar después de una escritura específica usando print, consulte ¿Cómo puedo vaciar la salida de la función de impresión? .

Eli Bendersky avatar Sep 20 '08 16:09 Eli Bendersky
Aceptado

De Magnus Lycka responde en una lista de correo :

Puede omitir el almacenamiento en búfer para todo un proceso de Python usando python -u o configurando la variable de entorno PYTHONUNBUFFERED.

También puede reemplazar sys.stdout con alguna otra secuencia como contenedor que se vacía después de cada llamada.

class Unbuffered(object):
   def __init__(self, stream):
       self.stream = stream
   def write(self, data):
       self.stream.write(data)
       self.stream.flush()
   def writelines(self, datas):
       self.stream.writelines(datas)
       self.stream.flush()
   def __getattr__(self, attr):
       return getattr(self.stream, attr)

import sys
sys.stdout = Unbuffered(sys.stdout)
print 'Hello'
Seb avatar Sep 20 '2008 09:09 Seb

Prefiero poner mi respuesta en ¿Cómo eliminar la salida de la función de impresión? ¿O en la función de impresión de Python que vacía el búfer cuando se llama? , pero como fueron marcados como duplicados de este (con lo que no estoy de acuerdo), lo responderé aquí.

Desde Python 3.3, print() admite el argumento de palabra clave "flush" ( consulte la documentación ):

print('Hello World!', flush=True)
Cristóvão D. Sousa avatar Feb 06 '2013 13:02 Cristóvão D. Sousa
# reopen stdout file descriptor with write mode
# and 0 as the buffer size (unbuffered)
import io, os, sys
try:
    # Python 3, open as binary, then wrap in a TextIOWrapper with write-through.
    sys.stdout = io.TextIOWrapper(open(sys.stdout.fileno(), 'wb', 0), write_through=True)
    # If flushing on newlines is sufficient, as of 3.7 you can instead just call:
    # sys.stdout.reconfigure(line_buffering=True)
except TypeError:
    # Python 2
    sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Créditos: "Sebastian", en algún lugar de la lista de correo de Python.

Federico A. Ramponi avatar Oct 08 '2008 07:10 Federico A. Ramponi

Sí, lo es.

Puede desactivarlo en la línea de comando con el interruptor "-u".

Alternativamente, puede llamar a .flush() en sys.stdout en cada escritura (o envolverlo con un objeto que haga esto automáticamente)

Brian avatar Sep 20 '2008 09:09 Brian