Показывать прогрессбар, используя tqdm из конвейера подпроцесса 7zip - PullRequest
0 голосов
/ 05 июня 2018

Я использую эту функцию (на основе this awnser), чтобы сжать папку в зашифрованный файл .zip с использованием 7zip в подпроцессе:

def zipbkp(directoryToZip):

    zipFileName = directoryToZip+".zip"
    password = "minmin3"

    appPath = "C:\Program Files\\7-Zip"
    zApp    = "7z.exe"
    zAction = 'a'
    zPass   = '-p{0} -mhe'.format(password)
    zAnswer = '-y'
    zDir    = directoryToZip
    progDir = os.path.join(appPath,zApp)

    print("[*] Trying to create .zip File, please wait...")
    cmd = [zApp, zAction, zipFileName, zPass, zAnswer, zDir]
    zipper = subprocess.Popen(cmd, executable=progDir, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

    #Lacking Progressbar here

    zipper.wait()
    print("[*] Successfully created .zip File")
    return zipFileName

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

Я успешно установил и использовал tqdm , прежде чем отобразить индикатор выполнения, но могучтобы заставить его работать с этим подпроцессом 7zip.

Для справки, вот как я использовал tqdm в сценарии загрузки ftp:

with tqdm(unit = 'blocks', unit_scale = True, leave = False, miniters = 1, desc = 'Uploading', total = filesize) as tqdm_instance:
        ftp.storbinary('STOR ' + filename, tmp, 2048, callback = lambda sent: tqdm_instance.update(len(sent)))

tqdm даже предоставляет пример использования конвейеровно я не очень понимаю это.В примере также используется grep, который недоступен в Windows.

example

Я также нашел этот пример , что еще хужечтобы понять.

Есть идеи, как получить и проанализировать информацию, предоставленную 7zip, используя tqdm?

1 Ответ

0 голосов
/ 23 ноября 2018

Чтобы использовать индикатор выполнения tqdm, вы можете просто создать индикатор выполнения с параметром total, как сделано здесь , затем вызвать update (, как здесь ) прохождение шага на панели.Вы также можете указать, что сумма указана в байтах, и вы хотите показать ее с помощью unit='B' и unit_scale=True

Это можно сделать с помощью 7zip в три этапа:

  1. Вызвав 7z l {zip file name}, вы можете получить размер файлов и их имена, чтобы скрипт мог вызвать команду и проанализировать вывод.В последних версиях Python рекомендуется использовать модуль подпроцесс .

  2. Создание экземпляра объекта tqdm с общим конечным размером несжатых файлов

  3. Используя subprocess.Popen, вы можете вызвать ['7z', 'x', '-bd', filename] (-bd избегать встроенных отчетов о ходе выполнения) и передать stdout=subprocess.PIPE, чтобы иметь возможность прочитать стандартный вывод процесса, используя process.stdout.readline(), где процесс - этозначение, возвращаемое Popen, и проанализируйте выходные данные, чтобы получить текущее состояние.Когда файл распакован, он сообщает свое имя, поэтому вы можете вызвать tqdm.update с относительным размером, полученным на шаге 1.

...