Python: impresiones múltiples en la misma línea

Quiero ejecutar un script, que básicamente muestra cosas como:

Installing XXX... [DONE] 

Ahora, en este momento, uso imprimir para imprimir toda la línea DESPUÉS de que la función haya tenido éxito. Sin embargo, ahora quiero imprimir “Instalar xxx …” primero, y DESPUÉS de que la función se haya ejecutado, para agregar la etiqueta “DONE”; pero en la misma linea.

¿Algunas ideas?

Puede utilizar la instrucción de print para hacer esto sin importar sys .

 def install_xxx(): print "Installing XXX... ", install_xxx() print "[DONE]" 

La coma al final de la línea de print evita que la print emita una nueva línea (debe tener en cuenta que habrá un espacio adicional al final de la salida).

La solución Python 3
Como lo anterior no funciona en Python 3, puedes hacer esto en su lugar (de nuevo, sin importar sys ):

 def install_xxx(): print("Installing XXX... ", end="", flush=True) install_xxx() print("[DONE]") 

La función de impresión acepta un parámetro end que por defecto es "\n" . Al establecerlo en una cadena vacía se evita que emita una nueva línea al final de la línea.

Simplemente puedes usar esto:

 print 'something', ... print ' else', 

y la salida será

 something else 

no hay necesidad de exagerar por import sys . Presta atención al símbolo de coma al final.

Python 3+ print("some string", end=""); para eliminar la inserción de nueva línea al final. Leer más por help(print);

Utilice sys.stdout.write('Installing XXX... ') y sys.stdout.write('Done') . De esta manera, debe agregar la nueva línea a mano con "\n" si desea recrear la funcionalidad de impresión. Creo que podría ser innecesario usar curses solo para esto.

Debe usar el retroceso ‘ \ r ‘ o (‘ \ x08 ‘) char para volver a la posición anterior en la salida de la consola

Python 2+:

 import time import sys def backspace(n): sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back for i in range(101): # for 0 to 100 s = str(i) + '%' # string for output sys.stdout.write(s) # just print sys.stdout.flush() # needed for flush when using \x08 backspace(len(s)) # back n chars time.sleep(0.2) # sleep for 200ms 

Python 3:

 import time def backline(): print('\r', end='') # use '\r' to go back for i in range(101): # for 0 to 100 s = str(i) + '%' # string for output print(s, end='') # just print and flush backline() # back to the beginning of line time.sleep(0.2) # sleep for 200ms 

Este código contará del 0% al 100% en una línea. El valor final será:

 > python test.py 100% 

Aquí hay información adicional sobre la descarga en este caso: ¿Por qué las declaraciones de impresión en python que contienen los argumentos ‘end =’ se comportan de manera diferente en los bucles while?

Ninguna de las respuestas funcionó para mí, ya que todas se detuvieron hasta que se encontró una nueva línea. Escribí un simple ayudante:

 def print_no_newline(string): import sys sys.stdout.write(string) sys.stdout.flush() 

Para probarlo:

 import time print_no_newline('hello ') # Simulate a long task time.sleep(2) print('world') 

“hola” primero se imprimirá y se irá a la pantalla antes de dormir. Después de eso puedes usar la impresión estándar.

sys.stdout.write se imprimirá sin el carro de retorno

 import sys sys.stdout.write("installing xxx") sys.stdout.write(".") 

http://en.wikibooks.org/wiki/Python_Programming/Input_and_output#printing_without_commas_or_newlines

Este ejemplo simple imprimirá 1-10 en la misma línea.

 for i in range(1,11): print (i, end=" ") 

Imprimir tiene un argumento final opcional, es lo que se imprime al final. El valor predeterminado es nueva línea, pero puede cambiarla a una cadena vacía. Ej .: print (“hola mundo!”, end = “”)

Más sencillo:

Python 3

  print('\r'+'something to be override',end='') 

Significa que hará retroceder el cursor hasta el principio, que imprimirá algo y terminará en la misma línea. Si en un bucle comenzará a imprimir en el mismo lugar que comienza.

Si desea sobrescribir la línea anterior (en lugar de agregarla continuamente), puede combinar \r con print(), al final de la statement de impresión. Por ejemplo,

 from time import sleep for i in xrange(0, 10): print("\r{0}".format(i)), sleep(.5) print("...DONE!") 

contará de 0 a 9, reemplazando el número anterior en la consola. El "...DONE!" se imprimirá en la misma línea que el último contador, 9.

En su caso para el OP, esto permitiría que la consola muestre el porcentaje completado de la instalación como una “barra de progreso”, donde puede definir una posición de carácter de inicio y final, y actualizar los marcadores intermedios.

 print("Installing |XXXXXX | 30%"), 

Aquí una versión compatible con 2.7 derivada de la versión 3.0 por @ Vadim-Zin4uk:

Python 2

 import time for i in range(101): # for 0 to 100 s = str(i) + '%' # string for output print '{0}\r'.format(s), # just print and flush time.sleep(0.2) 

Para el caso, la solución 3.0 provista se ve un poco hinchada. Por ejemplo, el método de retroceso no hace uso del argumento entero y probablemente podría eliminarse por completo.

Python 3

 import time for i in range(101): # for 0 to 100 s = str(i) + '%' # string for output print('{0}\r'.format(s), end='') # just print and flush time.sleep(0.2) # sleep for 200ms 

Ambos han sido probados y funcionan.

Este es un hilo muy antiguo, pero aquí hay una respuesta muy completa y un código de muestra.

\r es la representación de cadena de retorno de carro del conjunto de caracteres ASCII. Es lo mismo que octal 015 [ chr(0o15) ] o hexidecimal 0d [ chr(0x0d) ] o decimal 13 [ chr(13) ]. Ver man ascii para una lectura aburrida. Es ( \r ) una representación bastante portátil y es lo suficientemente fácil para que la gente lea. Simplemente significa mover el carro de la máquina de escribir hasta el principio sin hacer avanzar el papel. Es la parte CR de CRLF que significa retorno de carro y avance de línea .

print() es una función en Python 3. En Python 2 (cualquier versión que le interese usar), la print puede forzarse en una función importando su definición desde el módulo __future__ . La ventaja de la función de print es que puede especificar qué imprimir al final, anulando el comportamiento predeterminado de \n para imprimir una nueva línea al final de cada llamada a print() .

sys.stdout.flush le dice a Python que sys.stdout.flush la salida de la salida estándar , que es donde se envía la salida con print() menos que especifique lo contrario. También puede obtener el mismo comportamiento ejecutando python -u o configurando la variable de entorno PYTHONUNBUFFERED=1 , omitiendo así las llamadas import sys y sys.stdout.flush() import sys . La cantidad que gana haciendo eso es casi exactamente cero y no es muy fácil de depurar si olvida convenientemente que tiene que hacer ese paso antes de que su aplicación se comporte correctamente.

Y una muestra. Tenga en cuenta que esto se ejecuta perfectamente en Python 2 o 3.

 from __future__ import print_function import sys import time ANS = 42 FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0} for i in range(1, ANS + 1): if i in FACTORS: print('\r{0:d}'.format(i), end='') sys.stdout.flush() time.sleep(ANS / 100.0) else: print() 

En caso de que haya guardado previamente los valores en una matriz, puede llamarlos en el siguiente formato:

 for i in range(0,n): print arr[i], 

Encontré esta solución y está funcionando en Python 2.7.

 # Working on Python 2.7 Linux import time import sys def backspace(n): print('\r', end='') # use '\r' to go back for i in range(101): # for 0 to 100 s = str(i) + '%' # string for output sys.stdout.write(string) backspace(len(s)) # back for n chars sys.stdout.flush() time.sleep(0.2) # sleep for 200ms