¿Cómo puedo obligar a Python la función de impresión a la salida a la pantalla?

Esto no es un duplicado de Deshabilitar el almacenamiento en búfer de salida – el vinculado pregunta es intentar sin búfer de salida, aunque esto es más general. Las principales respuestas de la pregunta son demasiado poderosos o que participan de este (no muy buenas respuestas para esto), y esta pregunta se puede encontrar en Google por un relativo novato.

12 Comentarios

  1. 1253
    import sys
    sys.stdout.flush()

    print por defecto imprime a sys.stdout.

    Referencias

    Python 2

    Python 3

    • Dado que python 3.3. hay un alternaive enfoque – imprimir tiene argumento para vaciar ahora.
    • Para python3, usted puede agregar directamente los argumentos en función de impresión para el lavado de salida -> print(«ACEPTAR», ras= True)
  2. 328

    Ejecución python -h, veo un opción de línea de comandos:

    -u : sin memoria intermedia binario stdout y stderr; también PYTHONUNBUFFERED=x
    consulte la página man para más detalles sobre la búfer interno relativas a ‘-u’

    Aquí es el pertinentes doc.

  3. 311

    Desde Python 3.3, se puede forzar la normal print() función a ras sin la necesidad de utilizar sys.stdout.flush(); sólo tienes que configurar el «color» de la palabra clave argumento verdadero. De la documentación:

    de impresión(*objetos, sep=’ ‘, final=’\n’, file=sys.stdout, ras=False)

    Imprimir objetos en la secuencia de archivo, separados por la sep y luego por el final. sep, final y archivo, si está presente, debe ser dada como los parámetros de palabra clave.

    Todos los no-palabra clave argumentos se convierten en cadenas como str () ¿y por escrito a la corriente, separados por la sep y luego por el final. Tanto la sep y final deben ser cadenas; también pueden ser Ninguno, lo que significa que para utilizar los valores predeterminados. Si no hay objetos dados, print() se acaba de escribir al final.

    El archivo argumento debe ser un objeto con un write(cadena) método; si no está presente, o Ninguno, sys.stdout va a ser utilizado. Si la salida se almacenan en la memoria es generalmente determinada por archivo, pero si el color de la palabra clave argumento es true, la secuencia es la fuerza vacía.

  4. 161

    Cómo lavar la salida de Python print?

    Me sugieren cinco maneras de hacer esto:

    • En Python 3, llamada print(..., flush=True) (el color argumento no está disponible en Python 2 la función de impresión, y no hay analógicas para la instrucción print).
    • Llamada file.flush() en el archivo de salida (se puede envolver python 2 la función de impresión para ello), por ejemplo, sys.stdout
    • aplicar esto a cada función de impresión de la llamada en el módulo con una función parcial

      print = partial(print, flush=True) aplicada al módulo mundial.
    • aplicar esto para el proceso con una bandera (-u) pasó a la intérprete de comandos
    • aplicar esto a cada python proceso en su entorno con PYTHONUNBUFFERED=TRUE (y anular la variable para deshacer este).

    Python 3.3+

    Usando Python 3.3 o superior, sólo puede proporcionar flush=True como una palabra clave argumento de la print función:

    print('foo', flush=True) 

    Python 2 (o < 3.3)

    No backport la flush argumento para Python 2.7 Así que si usted está usando Python 2 (o menos de 3,3), y desea que el código que es compatible con ambos 2 y 3, sugiero la siguiente compatibilidad de código. (Nota de la __future__ importar debe estar en/muy «cerca de la la parte superior de tu 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()

    Por encima de la compatibilidad de código cubrirá la mayoría de los usos, pero de una forma mucho más profundo tratamiento, ver el seis módulo.

    Alternativamente, usted puede llamar a file.flush() después de la impresión, por ejemplo, con la instrucción print 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 para la función de impresión mediante el uso de functools.parcial en el ámbito global de un módulo:

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

    si miramos a 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 realmente podemos reemplazar el nuevo valor predeterminado:

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

    Nota de nuevo, esto sólo cambia el actual ámbito global, debido a que el nombre de la impresión en el actual ámbito global opacará el grupo builtin print (o función de eliminar la compatibilidad de la función, si el uso de Python 2, en que el actual ámbito global).

    Si quieres hacer esto dentro de una función, en lugar de en un módulo del ámbito global, usted debe darle un nombre diferente, por ejemplo:

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

    Si se declara un mundial en una función, está cambiando en el módulo del espacio de nombres global, por lo que debería acaba de poner en el espacio de nombres global, a menos que el comportamiento específico que es exactamente lo que usted desea.

    Cambiar el valor predeterminado para el proceso de

    Creo que la mejor opción es utilizar la -u bandera para obtener sin búfer de salida.

    $ python -u script.py

    o

    $ python -um package.module

    De la docs:

    Fuerza stdin, stdout y stderr a ser totalmente sin búfer. En los sistemas donde importa, también poner stdin, stdout y stderr en modo binario.

    Nota que hay búfer interno en el archivo.readlines() y Objetos de Archivo (para la línea en sys.stdin) que no está influenciada por esta opción. Para evitar esto, usted deseará utilizar el archivo.readline() dentro de un tiempo 1: el bucle.

    Cambiar el valor predeterminado para el shell entorno operativo

    Usted puede obtener este comportamiento para todos los python procesos en el entorno o entornos en los que se heredan desde el medio ambiente si establece la variable de entorno a un vacío de la cadena:

    por ejemplo, en Linux o OSX:

    $ export PYTHONUNBUFFERED=TRUE

    o Windows:

    C:\SET PYTHONUNBUFFERED=TRUE

    de la docs:

    PYTHONUNBUFFERED

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


    Anexo

    He aquí la ayuda en 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.
  5. 69

    También, como se sugiere en este blog uno puede volver a abrir sys.stdout sin búfer en modo:

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

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

    • En Ubuntu 12.04 en python 2.7 esto me da UnsupportedOperation: IOStream has no fileno.
    • Huy, Python 3 que se encuentra fuera. No me deja ejecutar este trozo de código!
    • Estoy confundido por este modismo. Después de hacer esto, no hay ahora dos Archivos como objetos (el original sys.stdout y el nuevo sys.stdout) que ambos piensan que «propietario» de la fileno? Eso es lo malo, lo correcto?
  6. 36

    El uso de la -u modificador de línea de comandos funciona, pero es un poco torpe. Esto significa que el programa podría comportarse de forma incorrecta si el usuario invoca el script sin la -u opción. Yo normalmente uso una custom stdout, como este:

    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 uso sys.stdout implícitamente), será automáticamente flushed.

    • Recomiendo que no se heredan de archivo y, a continuación, la delegación a stdout sumando. def __getattr__(self,name): return object.__getattribute__(self.f, name)
    • Sin los cambios sugeridos por el comentario de @diedthreetimes, me sale «ValueError: operación de e/S de archivo cerrado»
  7. 19

    ¿Por qué no tratar de usar un sin búfer de archivo?

    f = open('xyz.log', 'a', 0)

    O

    sys.stdout = open('out.log', 'a', 0)
    • Él no quiere ot crear un sin búfer de archivo; él quiere hacer de la existente stdout (redirigido a la consola, el terminal o lo que sea: esto no debe ser cambiado) sin búfer.
  8. 13

    Dan la idea no acaba de funcionar:

    #!/usr/bin/env python
    class flushfile(file):
        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)
    
    print "foo"

    El resultado:

    Traceback (most recent call last):
      File "./passpersist.py", line 12, in <module>
        print "foo"
    ValueError: I/O operation on closed file

    Creo que el problema es que hereda de la clase file, que en realidad no es necesario. De acuerdo a la documentación para el sys.stdout:

    stdout y stderr no necesita ser incorporada en
    los objetos de archivo: cualquier objeto es aceptable
    como siempre que tiene un método write()
    que toma un argumento de cadena.

    lo que el cambio de

    class flushfile(file):

    a

    class flushfile(object):

    hace que funcione bien.

    • No voto porque este ES @Dan la solución… (Que más bien debe comentar el post en lugar de copiar su solución)
  9. 8

    Aquí está mi versión, que proporciona writelines() y fileno(), y también:

    class FlushFile(object):
        def __init__(self, fd):
            self.fd = fd
    
        def write(self, x):
            ret = self.fd.write(x)
            self.fd.flush()
            return ret
    
        def writelines(self, lines):
            ret = self.writelines(lines)
            self.fd.flush()
            return ret
    
        def flush(self):
            return self.fd.flush
    
        def close(self):
            return self.fd.close()
    
        def fileno(self):
            return self.fd.fileno()
    • Solución Superior. Y funciona. Probado en Python 3.4.0. Con las otras versiones, que se derivan de file, me sale un error. No hay file clase.
  10. 5

    En Python 3 puede sobrescribir la función de impresión con defecto flush = True

    def print(*objects, sep=' ', end='\n', file=sys.stdout, flush=True):
        __builtins__.print(*objects, sep=sep, end=end, file=file, flush=flush)
    • esta respuesta parece un poco de luz a todos los otros de alta calidad de las respuestas. es posible que desee agregar un poco más a él.
  11. 4

    Yo lo hice como esta en Python 3.4:

    '''To write to screen in real-time'''
    message = lambda x: print(x, flush=True, end="")
    message('I am flushing out now...')

Dejar respuesta

Please enter your comment!
Please enter your name here