Печать tqdm в новую строку

Я работаю над небольшой командной строкой в ​​python, где я показываю индикатор выполнения, используя модуль tqdm. Я слушаю вход пользователя, используя модуль msvcrt, чтобы прервать прогресс. После прерывания пользователь может перезагрузиться, введя "restart" в командной строке. Во второй раз, когда отображается индикатор выполнения, вместо того, чтобы обновлять ту же строку с прогрессом, каждый раз создается новая строка.

Как мне заставить его показать прогресс в той же строке?

Ошибка выполнения

Этот фрагмент кода иллюстрирует мое использование индикатора выполнения.

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'")

Ответ 1

Попробуйте использовать tqdm.tqdm.write вместо стандартного print()

Это напечатает выше индикатора выполнения и переместит индикатор выполнения на одну строку ниже.

Я проверил это с помощью приведенного ниже кода, нажатие space будет печатать в стандартный вывод, но не прерывать цикл. Не было на 100% ясно, чего вы пытаетесь достичь, так как ваша функция interrupt() проверяет только тип предоставленной строки. тип() встроенная функция

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()

РЕДАКТИРОВАТЬ: включить end параметр tqdm.write() как отметил Пол Netherwood tqdm.tqdm.write()

Ответ 2

Попробуйте с position=0 и leave=True

(Решение работает в Google Colab, чтобы избежать печати на новую строку)

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_ ), leave=True, position=0):
    pbar.update()

pbar.close()

Ответ 3

Попробуйте использовать tqdm.tnrange()

for я in tqdm.tnrange(len(df)):

Ongoing image finished image

Ответ 4

Я пробовал решение tqdm, но поскольку я использую Spyder (Anaconda), в моем случае оно не работает, как предполагалось, из-за упомянутого в других ответах конфликта между командами write и print. Я придумал простое и работающее, но не самое причудливое решение.

def ybar(progr, total, step=50):
    #starts with 1
    l2=(progr/total)//(1/step)
    if progr==1: print(f'[{total}]: '+'|'*int(l2), end = '') 
    else:
        l1=((progr-1)/total)//(1/step) 

        ll=int(l2-l1)
        if l1 < l2: 

            for j in range(1,ll+1):
                if (int(l1)+j)%5==0:
                    print('*', end = '')
                else:
                    print('|', end = '')
        if progr==total: print("  DONE")

И в результате вы получите простое: [100]: ||||||

for i in range(1,101):
    ybar(i,len(range(1,101)),50)
    #something

Здесь есть множество решений: Python Progress Bar

Ответ 5

Следующее является хакерским, но, кажется, работает достаточно хорошо для сброса tqdm:

from tqdm import tqdm as tqdm_base
def tqdm(*args, **kwargs):
    if hasattr(tqdm_base, '_instances'):
        for instance in list(tqdm_base._instances):
            tqdm_base._decr_instances(instance)
    return tqdm_base(*args, **kwargs)

Иногда предыдущий вывод печатается в начале (который я не уверен, как удалить), но я нахожу это намного менее раздражающим, чем переводы строки (особенно в длинных циклах).

Ответ 6

Попробуйте from tqdm import tqdm_notebook as tqdm вместо from tqdm import tqdm.