Comportamiento extraño en Python 3 usando el módulo sys

Mientras intentaba algunas cosas en mi intérprete de Python 3 (Python 3.4.2, instalado a través de brew), encontré algunas salidas extrañas que no esperaba:

>>> import sys >>> sys.stdout.write("foo") foo3 >>> sys.stderr.write("bar") 3 bar 

Después de experimentar con diferentes cadenas, creo que el número es la longitud de las entradas que paso.

He intentado esto en Python 2.7.8 (no da números en las salidas) y Python 3.4.2 creado por virtualenv (da el mismo resultado)

¿Se supone que la salida es así?

Tienes razón en que es la longitud. En Python 2, el método File.write() devolvió None . Cuando se hizo el movimiento a Python 3, el valor de retorno cambió a la cantidad de caracteres escritos.

La razón por la que obtiene la salida diferente de stdout y stderr probablemente tendrá que ver con el orden en que aparecen las cosas en los manejadores de archivos.

Para la salida stdout , write salidas "foo" luego el bucle REPL (en la gran tradición de los números PIN y los cajeros automáticos) envía la cuenta al mismo flujo.

Para stderr , es probable que el bucle REPL genere primero la salida estándar (la longitud) y luego el contenido del error estándar.

O bien, puede ser totalmente no determinista, probablemente no sea algo en lo que deba confiar, especialmente porque el bucle REPL no existe realmente, excepto en el modo interactivo del intérprete.

En el intérprete de python, cuando imprime algo, le muestra el resultado en stdout y stderr.

Lo probé en mi python 3.4. Esto es lo que creo que está sucediendo.

 sys.std.write("foo") = > foo3 

El intérprete escribe “foo” a la salida estándar. El intérprete luego imprime el resultado del método sys.stdout.write, que es 3. El resultado final es foo3. Pruebe sys.stdout.write (“foo \ n \ n”). Y esto podría ayudarte a ver.

 sys.stderr.write("bar") => 3 bar 

La secuencia err no es tan rápida como la salida estándar. Los 3 resultados de la escritura aparecen primero con un nuevo carácter de línea. La barra se imprime después.