¿Cómo puedo vaciar la salida de la función de impresión?

5 minutos de lectura

avatar de usuario
walter nissen

¿Cómo fuerzo Python? print función para vaciar la salida almacenada en búfer a la pantalla?

  • python -u <script.py> funcionó (descarga forzada, sin almacenamiento en búfer) para mí sin tener que modificar el script.

    –Charlie Parker

    10 de noviembre de 2021 a las 19:19

  • Tenga en cuenta que el comportamiento se rompe dentro de los IDE. Por ejemplo, PyCharm funciona correctamente en la consola de depuración, pero no en la consola de ejecución. Es posible que deba aislar que el problema existe en una terminal normal.

    – Charles Merriam

    31 de diciembre de 2021 a las 23:49

avatar de usuario
cesarb

En Python 3, print puede tomar una opción flush argumento:

print("Hello, World!", flush=True)

En Python 2, después de llamar printhacer:

import sys
sys.stdout.flush()

Por defecto, print imprime a sys.stdout (consulte la documentación para obtener más información sobre objetos de archivo).

  • si lo hago sys.stdout.flush() ¿puedo evitar poner la palabra clave al ras? Tengo muchas impresiones en mi archivo y no quiero cambiarlas + Quiero que mis archivos siempre se vacíen y no quiero escribirlo nunca. Siempre al ras es lo que quiero. pondrá sys.stdout.flush() que en la parte superior sea suficiente? (Estoy usando python 3 y superior)

    –Charlie Parker

    2 abr 2021 a las 20:01

  • No, tendrías que hacer sys.stdout.flush() (o usar print(..., flush=True) en Python 3) cada vez que llama print. Verifique esta respuesta para ver otra solución que podría funcionar para usted.

    – erobertc

    22 de abril de 2021 a las 0:03

  • sys.stdout.flush() también funciona con Python 3.

    – cristianp

    31 de octubre de 2021 a las 5:04

  • python -u <script.py> funcionó para mí sin tener que modificar el script.

    –Charlie Parker

    10 de noviembre de 2021 a las 19:19

  • probablemente muy tarde, pero si desea que sus huellas siempre se borren como @Charlie Parker, podría usar print = functools.partial(print, flush=True)

    – Nefanth

    24 de noviembre de 2021 a las 6:41

avatar de usuario
gimel

Correr python -hVeo un opción de línea de comando:

-u : stdout y stderr binarios sin búfer; también PYTHONUNBUFFERED=x consulte la página del manual para obtener detalles sobre el almacenamiento en búfer interno relacionado con ‘-u’

Aquí está el documentación relevante.

  • Si lo está ejecutando en la plataforma Linux/Unix, puede agregar el -u en la línea de comando del intérprete (primera línea del archivo de script), así que cambie la primera línea de (algo así como) #!/usr/bin/python3 a #!/usr/bin/python3 -u – ahora, cuando ejecute su script (por ejemplo, ./my_script.py) la -u siempre se agregará para ti

    –James Stevens

    7 sep 2020 a las 17:22

avatar de usuario
eugenio sajin

Desde Python 3.3, puede forzar el normal print() función para enjuagar sin necesidad de usar sys.stdout.flush(); simplemente establezca el argumento de la palabra clave “flush” en verdadero. De la documentación:

imprimir(*objetos, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)

Imprime objetos en el archivo de flujo, separados por sep y seguidos por end. sep, end y file, si están presentes, deben proporcionarse como argumentos de palabras clave.

Todos los argumentos que no son palabras clave se convierten en cadenas como lo hace str() y se escriben en la transmisión, separados por sep y seguidos por end. Tanto sep como end deben ser cadenas; también pueden ser Ninguno, lo que significa utilizar los valores predeterminados. Si no se dan objetos, print() simplemente escribirá fin.

El argumento del archivo debe ser un objeto con un método de escritura (cadena); si no está presente o Ninguno, se utilizará sys.stdout. El archivo generalmente determina si la salida se almacena en búfer, pero si el argumento de la palabra clave de descarga es verdadero, la secuencia se descarga a la fuerza.

  • si lo hago sys.stdout.flush() ¿puedo evitar poner la palabra clave al ras? Tengo muchas impresiones en mi archivo y no quiero cambiarlas + Quiero que mis archivos siempre se vacíen y no quiero escribirlo nunca. Siempre al ras es lo que quiero. pondrá sys.stdout.flush() que en la parte superior sea suficiente? (Estoy usando python 3 y superior)

    –Charlie Parker

    2 abr 2021 a las 20:01

  • por cierto lo hace import sys sys.stdout.flush() trabajo para python3 todavía? Preferiría no tener que modificar todos mis scripts para forzar el vaciado.

    –Charlie Parker

    10 de noviembre de 2021 a las 19:15

avatar de usuario
Rusia debe sacar a Putin

¿Cómo vaciar la salida de la impresión de Python?

Sugiero cinco maneras de hacer esto:

  • En Python 3, llama print(..., flush=True) (el argumento de descarga no está disponible en la función de impresión de Python 2 y no existe un análogo para la declaración de impresión).
  • Llamar file.flush() en el archivo de salida (podemos ajustar la función de impresión de Python 2 para hacer esto), por ejemplo, sys.stdout
  • aplique esto a cada llamada de función de impresión en el módulo con una función parcial,
    print = partial(print, flush=True) aplicado al módulo global.
  • aplique esto al proceso con una bandera (-u) pasado al comando del intérprete
  • aplique esto a cada proceso de python en su entorno con PYTHONUNBUFFERED=TRUE (y deshabilite la variable para deshacer esto).

Pitón 3.3+

Usando Python 3.3 o superior, puede simplemente proporcionar flush=True como un argumento de palabra clave para el print función:

print('foo', flush=True) 

Python 2 (o <3.3)

No respaldaron el flush argumento para Python 2.7 Entonces, si está usando Python 2 (o menos de 3.3) y quiere un código que sea compatible con 2 y 3, le sugiero el siguiente código de compatibilidad. (Nota la __future__ la importación debe estar en/muy “cerca del parte superior de su módulo“):

from __future__ import print_function
import sys

if sys.version_info[:2] < (3, 3):
    old_print = print
    def print(*args, **kwargs):
        flush = kwargs.pop('flush', False)
        old_print(*args, **kwargs)
        if flush:
            file = kwargs.get('file', sys.stdout)
            # Why might file=None? IDK, but it works for print(i, file=None)
            file.flush() if file is not None else sys.stdout.flush()

El código de compatibilidad anterior cubrirá la mayoría de los usos, pero para un tratamiento mucho más completo, ver el six módulo.

Alternativamente, puede simplemente llamar file.flush() después de imprimir, por ejemplo, con la declaración de impresión en Python 2:

import sys
print 'delayed output'
sys.stdout.flush()

Cambiar el valor predeterminado en un módulo a flush=True

Puede cambiar el valor predeterminado de la función de impresión utilizando functools.partial en el ámbito global de un módulo:

import functools
print = functools.partial(print, flush=True)

si observa nuestra nueva función parcial, al menos en Python 3:

>>> print = functools.partial(print, flush=True)
>>> print
functools.partial(<built-in function print>, flush=True)

Podemos ver que funciona como normal:

>>> print('foo')
foo

Y podemos anular el nuevo valor predeterminado:

>>> print('foo', flush=False)
foo

Tenga en cuenta nuevamente que esto solo cambia el alcance global actual, porque el nombre de impresión en el alcance global actual eclipsará el alcance integrado print (o elimine la referencia de la función de compatibilidad, si usa una en Python 2, en ese ámbito global actual).

Si desea hacer esto dentro de una función en lugar de en el alcance global de un módulo, debe darle un nombre diferente, por ejemplo:

def foo():
    printf = functools.partial(print, flush=True)
    printf('print stuff like this')

Si lo declara global en una función, lo está cambiando en el espacio de nombres global del módulo, por lo que debe colocarlo en el espacio de nombres global, a menos que ese comportamiento específico sea exactamente lo que desea.

Cambiar el valor predeterminado para el proceso

Creo que la mejor opción aquí es usar el -u marca para obtener una salida sin búfer.

$ python -u script.py

o

$ python -um package.module

Desde el documentos:

Obligue a stdin, stdout y stderr a estar totalmente sin búfer. En los sistemas donde importa, también ponga stdin, stdout y stderr en modo binario.

Tenga en cuenta que hay almacenamiento en búfer interno en file.readlines() y File Objects (para la línea en sys.stdin) que no está influenciado por esta opción. Para evitar esto, querrá usar file.readline() dentro de un bucle while 1:.

Cambiar el valor predeterminado para el entorno operativo de shell

Puede obtener este comportamiento para todos los procesos de Python en el entorno o entornos que heredan del entorno si establece la variable de entorno en una cadena no vacía:

por ejemplo, en Linux u OSX:

$ export PYTHONUNBUFFERED=TRUE

o ventanas:

C:\SET PYTHONUNBUFFERED=TRUE

desde el documentos:

PITÓN SIN BÚSQUEDA

Si se establece en una cadena no vacía, es equivalente a especificar la opción -u.


Apéndice

Aquí está la ayuda sobre la función de impresión de Python 2.7.12 – tenga en cuenta que hay no flush argumento:

>>> from __future__ import print_function
>>> help(print)
print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)
    
    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.

avatar de usuario
Antonio Hatchkins

Asimismo, como se sugiere en esta entrada de bloguno puede reabrir sys.stdout en modo sin búfer:

sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

Cada stdout.write y print la operación se enjuagará automáticamente después.

  • En Ubuntu 12.04 en python 2.7 esto me da UnsupportedOperation: IOStream has no fileno.

    – drevicko

    1 de julio de 2015 a las 4:58

  • Vaya, Python 3 se enteró. ¡No me deja ejecutar este fragmento de código!

    – EKons

    30 de abril de 2016 a las 17:43

  • Estoy confundido por este modismo. Después de hacer esto, ¿no hay ahora dos objetos similares a archivos (el sys.stdout original y el nuevo sys.stdout) que piensan que son “propietarios” del archivono? Eso es malo, ¿verdad?

    – Don Escotilla

    19 oct 2018 a las 13:41

  • si revisa los documentos, el almacenamiento en búfer = 0 solo funciona en modo binario. buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size in bytes of a fixed-size chunk buffer.

    – N4ppel

    11 de noviembre de 2021 a las 15:43


Con Python 3.x el print() La función se ha ampliado:

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

Entonces, solo puedes hacer:

print("Visiting toilet", flush=True)

Entrada de documentos de Python

  • En Ubuntu 12.04 en python 2.7 esto me da UnsupportedOperation: IOStream has no fileno.

    – drevicko

    1 de julio de 2015 a las 4:58

  • Vaya, Python 3 se enteró. ¡No me deja ejecutar este fragmento de código!

    – EKons

    30 de abril de 2016 a las 17:43

  • Estoy confundido por este modismo. Después de hacer esto, ¿no hay ahora dos objetos similares a archivos (el sys.stdout original y el nuevo sys.stdout) que piensan que son “propietarios” del archivono? Eso es malo, ¿verdad?

    – Don Escotilla

    19 oct 2018 a las 13:41

  • si revisa los documentos, el almacenamiento en búfer = 0 solo funciona en modo binario. buffering is an optional integer used to set the buffering policy. Pass 0 to switch buffering off (only allowed in binary mode), 1 to select line buffering (only usable in text mode), and an integer > 1 to indicate the size in bytes of a fixed-size chunk buffer.

    – N4ppel

    11 de noviembre de 2021 a las 15:43


avatar de usuario
Jean-François Fabre

Utilizando el -u El interruptor de línea de comandos funciona, pero es un poco torpe. Significaría que el programa potencialmente se comportaría incorrectamente si el usuario invocara el script sin el -u opción. Usualmente uso una costumbre stdoutcomo esto:

class flushfile:
  def __init__(self, f):
    self.f = f

  def write(self, x):
    self.f.write(x)
    self.f.flush()

import sys
sys.stdout = flushfile(sys.stdout)

… Ahora todos sus print llamadas (que utilizan sys.stdout implícitamente), será automáticamente flushedición

  • Recomiendo no heredar del archivo y luego delegar a stdout agregando. def __getattr__(self,name): return object.__getattribute__(self.f, name)

    – murió tres veces

    23 de junio de 2013 a las 19:21


  • Sin los cambios sugeridos por el comentario de @diedthreetimes, obtengo “ValueError: operación de E/S en archivo cerrado”

    – azul rápido

    27/04/2015 a las 22:43

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad