Печать 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)):
![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
.