Hay varias formas de escribir en stderr:
# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
Eso parece contradecir el zen de Python # 13 † , entonces, ¿cuál es la diferencia aquí y hay ventajas o desventajas de una forma u otra? ¿Qué camino se debe usar?
† Debe haber una, y preferiblemente solo una, forma obvia de hacerlo.
Respuestas:
Encontré que este es el único corto + flexible + portátil + legible:
La función
eprint
se puede usar de la misma manera que laprint
función estándar :fuente
print
en todo tu programa. Solo en el módulo que contiene la definición deeprint()
. Póngalo en un archivo pequeño por sí mismo, impórteloeprint
en sus otros archivos y puede continuar usando la declaración todo elprint
tiempo que desee.Es mi elección, simplemente más legible y decir exactamente lo que pretendes hacer y portátil en todas las versiones.
Editar: ser 'pitón' es un tercer pensamiento para mí sobre la legibilidad y el rendimiento ... con estas dos cosas en mente, con python el 80% de su código será pitónico. la comprensión de la lista es la "gran cosa" que no se usa con tanta frecuencia (legibilidad).
fuente
print
declaración es la impresión sencilla de valores sin cadenas, sin tener que convertirlos primero. Si necesita una declaración impresa, por lo tanto, recomendaría usar la tercera opción para estar preparado para Python 3sys.stderr.write()
nada comoprint
. No agrega una nueva línea.os.linesep
. Se trata destderr
que estamos hablando, después de todo. No quiero que la consola se equivoque con la nueva línea incorrecta.print >> sys.stderr
se ha ido en Python3. http://docs.python.org/3.0/whatsnew/3.0.html dice:Para muchos de nosotros, parece algo poco natural relegar el destino al final del comando. La alternativa
se ve más orientado a objetos, y va elegantemente de lo genérico a lo específico. Pero tenga en cuenta que
write
no es un reemplazo 1: 1 paraprint
.fuente
print('spam', file=sys.stderr)
. Si lo está haciendo una y otra vez, puede codificar la función 'eprint' como en la respuesta más popular, pero en ese caso, preguntaría, ¿qué hay de malo en el registro? stackoverflow.com/a/41304513/1450294with sys.stderr as dest:
antes una llamada sangría aprint("ERROR", file=dest)
Nadie lo ha mencionado
logging
todavía, pero el registro se creó específicamente para comunicar mensajes de error. La configuración básica configurará un controlador de flujo que escriba en stderr.Este guión:
tiene el siguiente resultado cuando se ejecuta en la línea de comando:
y bar.txt contendrá el 'hola mundo' impreso en stdout.
fuente
Para Python 2, mi elección es:
print >> sys.stderr, 'spam'
Porque simplemente puede imprimir listas / dictados, etc.print >> sys.stderr, {'spam': 'spam'}
en vez de:sys.stderr.write(str({'spam': 'spam'}))
fuente
"{0}".format({'spam': 'spam'})
, ¿no? Diría que debe evitar explícitamente la conversión a cadena. Editar: accidentalmente una gramáticaHice lo siguiente usando Python 3:
Así que ahora puedo agregar argumentos de palabras clave, por ejemplo, para evitar el retorno de carro:
fuente
Yo diría que tu primer acercamiento:
es el "Uno... forma obvia de hacerlo" Los otros no satisfacen la regla # 1 ("Hermoso es mejor que feo")
fuente
>>
sintácticamente? Entiendo que es un esfuerzo copiar bash>
, entonces, ¿es una sintaxis con horquilla para hacer eso?std::cout << "spam";
Esto imitará la función de impresión estándar pero se imprimirá en stderr
fuente
print
No incluye un rubor.En Python 3, uno puede usar print ():
casi fuera de la caja:
o:
Esto es sencillo y no necesita incluir nada además
sys.stderr
.fuente
EDITAR En retrospectiva, creo que la posible confusión al cambiar sys.stderr y no ver el comportamiento actualizado hace que esta respuesta no sea tan buena como simplemente usar una función simple como otros han señalado.
Usar parcial solo le ahorra 1 línea de código. La posible confusión no vale la pena guardar 1 línea de código.
original
Para hacerlo aún más fácil, aquí hay una versión que usa 'parcial', que es una gran ayuda en las funciones de ajuste.
Luego lo usas así
Puede verificar que se está imprimiendo en stderr y no en stdout haciendo lo siguiente (código superior de http://coreygoldberg.blogspot.com.au/2009/05/python-redirect-or-turn-off-stdout-and .html ):
La desventaja de esto es parcial asigna el valor de sys.stderr a la función envuelta en el momento de la creación. Lo que significa que si redirige stderr más tarde, no afectará esta función. Si planea redirigir stderr, utilice el método ** kwargs mencionado por aaguirre en esta página.
fuente
Lo mismo se aplica a stdout:
Como se indicó en las otras respuestas, la impresión ofrece una interfaz bonita que a menudo es más conveniente (por ejemplo, para imprimir información de depuración), mientras que la escritura es más rápida y también puede ser más conveniente cuando tiene que formatear la salida exactamente de cierta manera. También consideraría la mantenibilidad:
Más tarde, puede decidir cambiar entre stdout / stderr y un archivo normal.
La sintaxis de print () ha cambiado en Python 3, por lo que si necesita admitir ambas versiones, write () podría ser mejor.
fuente
from __future__ import print_function
es una mejor manera de admitir Python 2.6+ y Python 3.Estoy trabajando en Python 3.4.3. Estoy cortando un poco de mecanografía que muestra cómo llegué aquí:
¿Funcionó? Intente redirigir stderr a un archivo y vea qué sucede:
Bueno, aparte del hecho de que la pequeña introducción que te da Python se ha convertido en stderr (¿a dónde más iría?), Funciona.
fuente
Si haces una prueba simple:
¡Encontrará que sys.stderr.write () es consistentemente 1.81 veces más rápido!
fuente
Si desea salir de un programa debido a un error fatal, use:
y
import sys
en el encabezado.fuente
La diferencia entre imprimir y la función de escritura de stderr : stderr : stderr (error estándar) es una tubería integrada en todos los sistemas UNIX / Linux, cuando su programa se bloquea e imprime información de depuración (como un rastreo en Python), va al stderr tubo.
impresión : print es un contenedor que formatea las entradas (la entrada es el espacio entre el argumento y la nueva línea al final) y luego llama a la función de escritura de un objeto dado, el objeto dado por defecto es sys.stdout, pero podemos pasar un archivo, es decir, podemos imprimir la entrada en un archivo también.
Python2: si estamos usando python2 entonces
http://python3porting.com/noconv.html
https://docs.python.org/2/library/logging.html#logger-objects
fuente