Как использовать индикатор выполнения, когда мой сценарий выполняет какую-то задачу, которая может занять некоторое время?
Например, функция, которая требует некоторого времени для завершения и возвращает True
после завершения. Как я могу отобразить индикатор выполнения во время выполнения функции?
Обратите внимание, что мне нужно, чтобы это было в режиме реального времени, поэтому я не могу понять, что с этим делать. Нужно ли thread
для этого? Я понятия не имею.
Прямо сейчас я ничего не печатаю во время выполнения функции, однако индикатор выполнения был бы неплох. Также меня больше интересует, как это можно сделать с точки зрения кода.
Ответы:
Существуют определенные библиотеки ( например, здесь ), но может быть что-то очень простое:
Примечание: progressbar2 - это ветвь ProgressBar, которая не поддерживалась годами.
источник
NameError: name 'xrange' is not defined
ошибку. Я пропускаю модуль?xrange
- это Питон 3range
.print('■', end='', flush=True)
С tqdm вы можете добавить индикатор прогресса в ваши циклы в секунду:
Также существует графическая версия tqdm, поскольку
v2.0.0
(d977a0c
):Но будьте осторожны, поскольку вы
tqdm_gui
можете вызвать aTqdmExperimentalWarning: GUI is experimental/alpha
, вы можете игнорировать его, используяwarnings.simplefilter("ignore")
, но он будет игнорировать все предупреждения в вашем коде после этого.источник
__len__
свойство, или пользователь должен предоставитьtotal
аргументtqdm
. Еще, бар будет работать, но без ETA.from tqdm import tqdm_notebook as tqdm
. В противном случае не пишите это в одной строке.Приведенные выше предложения довольно хороши, но я думаю, что большинство людей просто хотят получить готовое решение, не зависящее от внешних пакетов, но также пригодное для повторного использования.
Я получил лучшие из всего вышеперечисленного и превратил его в функцию вместе с контрольными примерами.
Чтобы использовать его, просто скопируйте строки в «def update_progress (progress)», но не тестовый скрипт. Не забудьте импортировать sys. Вызывайте это всякий раз, когда вам нужно отобразить или обновить индикатор выполнения.
Это работает путем прямой отправки символа "\ r" на консоль, чтобы переместить курсор назад к началу. «print» в python не относится к вышеуказанному символу для этой цели, поэтому нам нужен 'sys'
Вот что показывает результат тестового скрипта (анимация последнего индикатора выполнения):
источник
in range(101)
показывать не 100, прогресс останавливается на 99% и никогда не показывается.Этот ответ не зависит от внешних пакетов , я также думаю, что большинство людей просто хотят готовый кусок кода . Приведенный ниже код можно адаптировать к вашим потребностям, настроив: символ прогресса
'#'
строкиsize
, строку , текстprefix
и т. Д.Использование:
Вывод:
Не требует второго потока . Некоторые решения / пакеты выше требуют. Второй поток может быть проблемой,
jupyter notebook
например, для.Работает с любой итерацией, это означает все, что
len()
можно использовать. Alist
,dict
о чем-нибудь, например['a', 'b', 'c' ... 'g']
Вы также можете изменить вывод, изменив файл,
sys.stderr
например, наисточник
TypeError: object of type 'generator' has no len()
generators
) вы должны обернуть его сlist()
. Likefor i in progressbar(list(your_generator), "Computing: ", 40):
для аналогичного приложения (отслеживание прогресса в цикле) я просто использовал python-progressbar :
Их пример выглядит примерно так:
источник
progressbar2
пакет. Код выше будет работать с ним.import *
?Попробуйте прогресс с https://pypi.python.org/pypi/progress .
Результатом будет строка, подобная следующей:
источник
progress
делает хорошие бары, но терпит неудачу , если другое программное обеспечение манипулируетstderr
. извините, но я не исследовал точную проблему.Я только что сделал простой класс прогресса для своих нужд после поиска здесь эквивалентного решения. Я подумал, что могу опубликовать это.
Пример :
Напечатает следующее:
[======== ] 17/80 ( 21%) 63 to go
источник
progress.current
инкремент в конце,__call__
чтобы еще больше ограничить взаимодействие с объектом из основного кода.Мне нравится ответ Брайана Хуу за его простоту и отсутствие необходимости во внешних пакетах. Я немного изменил его, поэтому добавляю свою версию здесь:
Требуется общее количество запусков (
total
) и количество обработанных запусков (progress
)total >= progress
. Результат выглядит так:источник
Вы можете использовать tqdm :
В этом примере индикатор выполнения работает в течение 5 минут, и он показан так:
Вы можете изменить его и настроить как вам угодно.
источник
Чтобы использовать любые рамки индикаторов прогресса полезным способом, то есть получить фактический процент прогресса и предполагаемое ETA, вы должны быть в состоянии объявить, сколько шагов у него будет.
Итак, ваша вычислительная функция в другом потоке, вы можете разделить ее на несколько логических шагов? Можете ли вы изменить его код?
Вам не нужно реорганизовывать его или разделять на реальные методы, вы можете просто поместить некоторые стратегические
yield
элементы в некоторые места внутри него! Если в дорогой функции есть цикл for , просто поместите его в нее. Вы должны знать только в конце, сколько будет сделано урожая, чтобы получить лучшие результаты.Таким образом, ваша функция может выглядеть примерно так:
или это:
С такой функцией вы можете установить:
И используйте это как:
Получить крутой прогресс-бар!
Отказ от ответственности: я являюсь автором alive_progress, но он должен хорошо решить вашу проблему. Прочитайте документацию по адресу https://github.com/rsalmei/alive-progress , вот пример того, что он может сделать:
источник
Мне очень нравится python-progressbar , так как он очень прост в использовании.
Для самого простого случая это просто:
Внешний вид может быть настроен, и он может отображать приблизительное оставшееся время. Для примера используйте тот же код, что и выше, но с:
источник
Если это большой цикл с фиксированным количеством итераций, занимающий много времени, вы можете использовать эту функцию, которую я сделал. Каждая итерация цикла добавляет прогресс. Где count - это текущая итерация цикла, total - это значение, к которому вы обращаетесь, а size (int) - насколько вы хотите, чтобы бар был с шагом 10, т. Е. (Размер 1 = 10 символов, размер 2 = 20 символов)
пример:
вывод:
источник
Используйте эту библиотеку:
fish
( GitHub ).Использование:
Радоваться, веселиться!
источник
Приведенный ниже код является довольно общим решением, а также имеет оценку времени и оставшегося времени. Вы можете использовать любую итерацию с ним. Индикатор выполнения имеет фиксированный размер 25 символов, но он может отображать обновления с шагом 1%, используя символы полного, половины и четверти блока. Вывод выглядит так:
Код с примером:
Предложения по улучшению или другие комментарии приветствуются. Ура!
источник
Мне нравится эта страница .
Начинается с простого примера и переходит на многопоточную версию. Работает из коробки. Никаких сторонних пакетов не требуется.
Код будет выглядеть примерно так:
Или вот пример использования потоков для запуска вращающейся полосы загрузки во время работы программы:
источник
Это довольно просто в Python3:
источник
При работе в ноутбуках Jupyter использование обычного tqdm не работает, так как записывает вывод в несколько строк. Используйте это вместо:
источник
Если ваша работа не может быть разбита на измеримые куски, вы можете вызвать вашу функцию в новом потоке и узнать, сколько времени это займет:
Очевидно, вы можете увеличить точность синхронизации по мере необходимости.
источник
Мне нравится Габриэль ответ, но я изменил его, чтобы быть гибким. Вы можете отправить длину строки в функцию и получить индикатор выполнения с любой длиной, которую вы хотите. И вы не можете иметь индикатор выполнения с нулевой или отрицательной длиной. Кроме того, вы можете использовать эту функцию, как Габриэль ответ (см. Пример № 2).
Результат:
источник
Я использовал
format()
метод, чтобы сделать бар нагрузки. Вот мое решение:Вывод:
источник
Вот краткое решение, которое строит загрузочную полосу программно (вы должны решить, как долго вы этого хотите).
источник
Попробуйте PyProg. PyProg - это библиотека с открытым исходным кодом для Python, позволяющая создавать супер настраиваемые индикаторы и индикаторы выполнения.
Это в настоящее время в версии 1.0.2; он размещен на Github и доступен на PyPI (ссылки внизу). Он совместим с Python 3 и 2, а также может использоваться с Qt Console.
Это действительно легко использовать. Следующий код:
будет производить:
Я на самом деле сделал PyProg, потому что мне нужна простая, но супер настраиваемая библиотека индикатора выполнения. Вы можете легко установить с помощью :
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
источник
Вы также можете использовать просветить . Основным преимуществом является то, что вы можете одновременно входить в систему, не перезаписывая свой индикатор выполнения.
Он также обрабатывает несколько индикаторов выполнения.
источник
Используйте библиотеку прогресса !
Вот пользовательский подкласс, который я написал, чтобы отформатировать ETA / Elapsed times в лучший читаемый формат:
источник
Это мое простое решение:
источник
Вы должны связать индикатор выполнения с поставленной задачей (чтобы он измерял прогресс: D). Например, если вы отправляете файл по FTP, вы можете указать ftplib захватить буфер определенного размера, скажем, 128 КБ, а затем добавить в свой индикатор выполнения любой процент от размера файла 128 КБ. Если вы используете CLI, а ваш индикатор прогресса имеет длину 20 символов, вы добавили бы один символ, когда была передана 1/20 файла.
источник
@Massagran: Это хорошо работает в моих программах. Кроме того, нам нужно добавить счетчик, чтобы указать время цикла. Этот счетчик играет роль аргумента метода
update
. Например: прочитать все строки тестового файла и обработать их на чем-нибудь. Предположим, что функцияdosth()
не относится к переменнойi
.Переменная
i
контролирует состояниеpbar
через методupdate
источник
немного более общий ответ jelde015 (кредит ему, конечно)
Для обновления полосы загрузки вручную будет:
и называя это:
приведет к:
просто вызывайте его, когда хотите, с текущим
i
значением.установить
size
количество символов в бареисточник
Думаю, я немного опоздал, но это должно работать для людей, работающих с текущими версиями Python 3 , так как здесь используются "f-strings" , как представлено в Python 3.6 PEP 498 :
Код
пример
Вывод
источник
Это простой способ создать индикатор
источник