Python tqdm индикатор выполнения общего прогресса в качестве входных данных - PullRequest
0 голосов
/ 22 октября 2018

Это на самом деле не вопрос, а улучшение кода, и может помочь другим в любом случае, так как я уже нашел простой обходной путь.

Мне было интересно, как я могу дать индикатор выполнения из модуля "tqdm" общего ввода вместо приращений, как требуется для функции "ручного обновления" tqdm.update ().

Поэтому главная причина, по которой мне нужно было это знать, - загрузчик YouTube из модуля «pytube», показывающий ход загрузки.Когда я вызываю функцию .download (), насколько я понимаю, она запускает цикл while, выбирая данные и вызывая пользовательскую функцию progressFunction с оставшимся количеством байтов в качестве входных данных.Имея глобальную переменную, равную размеру файла, я могу вычислить общий прогресс, размер файла минус оставшийся объем загрузки, что позволяет регистрировать прогресс.Теперь в этом случае было бы неплохо, если бы индикатор выполнения из tqdm принимал этот общий прогресс, но опять же, .update () принимает только увеличение числа итераций.

Поэтому я провел поиск в_tqdm.py код и обнаружил, что предыдущая переменная итерации хранится в self.n.Таким образом, приращение можно вычислить так: inc = new_iter - pbar.n, где pbar - это экземпляр индикатора выполнения tqdm.

Вот пример кода аналогичной функции, чтобы проиллюстрировать это.Она имеет функцию цикла while, которая ничего не возвращает, но дает ввод другой функции.Скопируйте и вставьте его, если хотите, он покажет простой индикатор выполнения от 0 до 100.

import time
from tqdm import tqdm

def functExec(a):
    global pbar
    a_prev = pbar.n
    step_tqdm = a-a_prev
    pbar.update(step_tqdm)

def functLoop(functExec,range,step):
    a = 0 
    while a<range:
        a += step
        functExec(a)
        time.sleep(0.02)

N = 100
step = 1
pbar = tqdm(total=N/step)
functLoop(functExec,range=N,step=step)
pbar.close()

Так что, как вы можете видеть, pbar - это экземпляр индикатора выполнения tqdm.Это инициализируется до вызова цикла while.В функции «functLoop» переменная «a» зацикливается от 0 до 100 с помощью цикла while и вызывает «functExec», который обновляет индикатор выполнения.Вы можете заметить, что pbar.n вызывается и является значением итерации, которую pbar имеет до ее обновления .Чтобы получить приращение, просто вызывается a-pbar.n, и этот pbar обновляется функцией .update ().

ЗАКЛЮЧИТЬ: да, это работает так, как я хотел, но мне интересно, могу ли я просто использовать переменную "a", чтобы напрямую назначить индикатор выполнения общему прогрессу, вместо того, чтобы сначала использовать шаг.

Все еще надеюсь, что это помогло некоторым из вас, искал более 4 часов, так как я не мог найти, как сделать это в Интернете:)

РЕДАКТИРОВАТЬ: TLDR: Короче, давайтеДопустим, вы хотите выполнить итерацию от 0 до 100 и задокументировать ход выполнения с помощью tqdm, но в случае, когда , вы можете получить только текущее значение итерации или общий прогресс .Мне удалось показать прогресс с этим кодом, , но мне было просто интересно, есть ли для него встроенная функция в модуле "tqdm" .Текущий исходный код позволяет только постепенно изменять индикатор выполнения.Имеет смысл, что такая функция должна быть, потому что вы инициализируете размер объекта tqdm с помощью параметра «total» и можете легко рассчитать прогресс с текущим общим прогрессом напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...