¿Por qué tqdm imprime en una nueva línea en lugar de actualizar la misma línea?

4 minutos de lectura

Avatar de usuario de Pieter Helsen
Pieter Helsen

Estoy trabajando en un pequeño juego de línea de comandos en python donde muestro una barra de progreso usando el módulo tqdm. Escucho la entrada del usuario usando el módulo msvcrt para interrumpir el progreso. Una vez interrumpido, el usuario puede reiniciar ingresando ‘reiniciar’ en el indicador de línea de comando. La segunda vez que se muestra la barra de progreso, en lugar de actualizar la misma línea con el progreso, crea una nueva línea cada vez.

¿Cómo haría para que muestre el progreso en la misma línea?

Problema con la barra de progreso

Este fragmento de código ilustra mi uso de la barra de progreso.

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format="{l_bar}{bar}|"):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                break

def interrupt():
    type("File transfer interrupted, to restart the transfer, type 'restart'")

Avatar de usuario de SciPy
SciPy

Prueba con position=0 y leave=True

(Solución trabajando en Colaboración de Google para evitar imprimir en una nueva línea)

from tqdm import tqdm 
import time

def foo_():
    time.sleep(0.3)
range_ = range(0, 10)
total = len(range_)

with tqdm(total=total, position=0, leave=True) as pbar:
   for i in tqdm((foo_, range_ ), position=0, leave=True):
    pbar.update()

  • Si haces una celda colab con from functools import partial, from tqdm import tqdm, tqdm = partial(tqdm, position=0, leave=True) en la parte superior de su computadora portátil, esto lo configurará para que pueda llamar tqdm(iterable) y funcionará muy bien en colab.

    – Roberto Bracco

    27 de julio de 2020 a las 15:13


  • for i in tqdm(range(n), position=0, leave=True) también me funciona en PyCharm

    – Blupon

    1 oct 2021 a las 13:37

  • Esto también funciona tanto en jupyterlab como en terminal.

    – LI Xuhong

    20 oct 2021 a las 6:43

  • en lugar de tqdm.tqdm. Usar tqdm.auto.tqdm

    – Vivasvan Patel

    7 de noviembre de 2021 a las 14:01

  • ¿Funcionará esto si un paquete usa tqdm internamente? Supongo que no, ya que el paquete tendría su propio from tqdm import tqdm declaración o similar.

    – Libra esterlina

    20 de junio a las 18:58

Avatar de usuario de Laurent GRENIER
laurent grenier

tqdm_cuaderno es obsoleto. Debes usar tq.notebook.tqdm en cambio.

import tqdm.notebook as tq
for i in tq.tqdm(...):

Además, tqdm_notebook fue realmente miserable en términos de rendimiento. Eso está completamente corregido con la nueva biblioteca.

  • Esto no muestra ninguna barra de progreso en una sesión de jupyter Lab

    – 00__00__00

    15 de octubre de 2020 a las 12:07

  • ¿Cómo trabajaste con asyncio sin tqdm.asyncio?

    – Joe Huang

    12 de julio de 2021 a las 7:36

  • @00__00__00 necesitarías instalar/actualizar ipywidgeds y activarlo Widgets bash pip install ipywidgets jupyter nbextension enable --py widgetsnbextension s

    – Señor Mushn

    14 de junio a las 16:55


Avatar de usuario de José Vicente
jose vicente

Me di cuenta de que cerrar las instancias de tqdm antes de volver a usar tqdm soluciona el problema de imprimir la barra de estado en una nueva línea en Jupyter Lab:

while len(tqdm._instances) > 0:
    tqdm._instances.pop().close()

O mejor aún, gracias a Nirmal por la sugerencia:

tqdm._instances.clear()

  • Maldita sea, todo este tiempo he estado reiniciando portátiles Jupyter para arreglar las cosas de varias líneas. Esto es realmente útil, ¡gracias!

    – Jay Mody

    26 de mayo de 2020 a las 4:04

  • esto lo soluciono!

    – Vaaal88

    2 feb a las 13:41

Avatar de usuario de RAHUL TIWARI
RAHUL TIWARI

Me enfrenté mucho a este problema y, a veces, position = 0 & leave = True no funciona. Entonces, encontré una forma alternativa.

En vez de tqdm.tqdm puedes usar tqdm.auto.tqdm

o
en vez de

from tqdm import tqdm

intenta usar

from tqdm.auto import tqdm

from tqdm import tqdm_notebook

este comando funciona en google colab.

Intenta usar tqdm.tqdm.write en lugar de la norma print()

Esto imprimirá encima de la barra de progreso y moverá la barra de progreso una fila hacia abajo.

Probé esto usando el siguiente código, presionando space imprimirá en stdout pero no romperá el ciclo. No estaba 100% claro lo que está tratando de lograr, ya que el interrupt() La función suya solo verifica el tipo de la cadena proporcionada. función incorporada tipo ()

import tqdm
import msvcrt
from time import sleep

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format="{l_bar}{bar}|"):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                # break

def interrupt():
    tqdm.tqdm.write("File transfer interrupted, to restart the transfer, type 'restart'", end="")

transfer()

EDITAR: para incluir end parámetro de tqdm.write() como señaló Paul Netherwood
tqdm.tqdm.escribir()

Avatar de usuario de Hamman Samuel
Hamman Samuel

from tqdm import notebook

En vez de tqdm(looping)

Usar notebook.tqdm(looping)

¿Ha sido útil esta solución?