Deshabilitar el almacenamiento en búfer de salida
¿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:
- Utilice el
-u
interruptor de línea de comando - Envolver
sys.stdout
en un objeto que se vacía después de cada escritura. - Establecer
PYTHONUNBUFFERED
var de entorno sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
¿ Hay alguna otra forma de establecer algún indicador global en sys
/ sys.stdout
mediante 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? .
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'
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)
# 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.
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)