2009-06-02 16 views

Respuesta

32

Son solo dos cosas diferentes. print generalmente va a sys.stdout. Vale la pena saber la diferencia entre stdin, stdout, and stderr - todos tienen sus usos.

En particular, stdout se debe utilizar para la salida de programa normal, mientras que stderr se debe reservar solo para mensajes de error (ejecución anormal del programa). Existen utilidades para dividir estas transmisiones, lo que permite a los usuarios de su código diferenciar entre salida normal y errores.

+13

También tenga en cuenta que stderres sin búfer, que puede ser útil. – JimB

+6

Me gustaría modificar la redacción de su respuesta para reemplazar "salida de programa" con "salida de programa no textual o no de estado". stderr tampoco debe reservarse para mensajes de error en todos los casos, por ejemplo, un programa que descarga a stdout, que se canaliza a otro programa, pero imprime el progreso de la descarga en stderr (que llega a 'salir' de la tubería). –

+0

@JimB en qué sentido? – JinSnow

80

print puede imprimir en cualquier objeto similar a un archivo, incluido sys.stderr.

print >> sys.stderr, 'Text' 

Las ventajas de utilizar sys.stderr de errores en lugar de sys.stdout son:

  • Si el usuario redirigir la salida estándar a un archivo, ella todavía ve errores en la pantalla.
  • No está almacenado en el búfer, por lo que si se redirige sys.stderr a un archivo de registro, hay menos posibilidades de que el programa se bloquee antes de que se haya registrado el error.

Esta respuesta escrita con Python 2 en mente. Para Python 3, use print('Text', file=sys.stderr) en su lugar.

+1

+1. ¡estupendo! No estaba al tanto de esta propiedad de 'imprimir' – db42

30

Tenga cuidado: aquí hay algunas sutilezas, incluso si las transmisiones van a dispositivos interactivos o no. La mayor sorpresa es que en Python 3 stderr se almacena en línea (al menos en Unix). Por ejemplo, en una ventana de terminal, la siguiente imprime un número cada dos segundos en Python 2:

for n in range(5): 
    print >> sys.stderr, n,  # final comma to squelch newline character 
    time.sleep(2) 

mientras que en Python 3, los siguientes grabados los números de todos juntos cuando los acabados de bucle:

for n in range(5): 
    print(n, file=sys.stderr, end='') # print n to sys.stderr with no newline char 
    time.sleep(2) 
+4

Muy interesante. Me pregunto por qué decidieron ir por esa ruta con Python 3. –

+0

Se trata de una línea almacenada en un terminal y completamente almacenada en el búfer cuando se escribe en un archivo. :(FAIL. –

2

Es útil separar stderr y stdout cuando ejecuta el script redirigiéndolos a diferentes archivos. Normalmente utilizo stderr para los mensajes de registro y para realizar un seguimiento del flujo del programa, pero uso stdout para obtener más mensajes útiles que voy a utilizar más adelante.

Una otra manera de escribir en stderr es como el siguiente ejemplo:

import sys 
sys.stderr.write("Error has occurred opening a file!") 
+2

¡Genial! :) log = sys.stderr.write; log ("hola") – AME