Вопрос

Я хочу сделать простой цикл по n итерациям. Каждая итерация содержит операцию копирования, из которой я знаю, сколько байтов было скопировано. Мой вопрос: как я могу также показать количество МБ / с на индикаторе выполнения?

Примере

Я показываю индикатор выполнения около rsync. Я изменил этот ответ следующим образом:

import subprocess
import sys
import re
import tqdm

n = len(open('myfiles.txt').readlines())
your_command = 'rsync -aP --files-from="myfiles.txt" myhost:mysource .'
pbar = tqdm.trange(n)

process = subprocess.Popen(your_command, stdout=subprocess.PIPE, shell=True)
for line in iter(process.stdout.readline, ''):
    line = line.decode("utf-8")
    if re.match(r'(.*)(xfr\#)([0-9])(.*)(to\-chk\=)([0-9])(.*)', line):
        pbar.update()

При этом myfiles.txt содержит список файлов. Это дает мне хороший индикатор выполнения, показывающий количество итераций в секунду.

Тем не менее, итоговая строка, которую я сравниваю, сигнализирует о том, что файл был скопирован, например

  682,356 100%  496.92kB/s    0:00:01 (xfr#5, to-chk=16756/22445)

Также содержит количество скопированных байтов, которое я хочу использовать, чтобы показать скорость копирования.

1
Tom de Geus 12 Фев 2021 в 12:42

1 ответ

Лучший ответ

Ниже я привел код, делающий то, что вам нужно.

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

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

Попробуйте онлайн!

import tqdm
def gen(cnt):
    import time, random
    for i in range(cnt):
        time.sleep(random.random() * 0.125)
        yield random.randrange(1 << 20)
total_iterations = 150
pbar = tqdm.tqdm(total = total_iterations, ascii = True)
sbar = tqdm.tqdm(unit = 'B', ascii = True, unit_scale = True)
for e in gen(total_iterations):
    pbar.update()
    sbar.update(e)

Выход:

  9%|█████████▉                               | 89/1000 [00:11<01:53,  8.05it/s]
40.196MiB [00:11,  3.63MiB/s]

Видео в формате ASCII (+ ссылка):

gif

1
Arty 12 Фев 2021 в 12:39