0

我正在使用此功能(基于awnser)在子进程中使用 7zip 将文件夹压缩为加密的 .zip 文件:

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

这工作正常。我唯一的问题是因为要压缩的目录非常大,所以我想提供有关压缩进度的信息。

我之前已经成功安装并使用了 tqdm来显示进度条,但无法让它与这个 7zip 子进程一起工作。

作为参考,这是我在 ftp 上传脚本上使用 tqdm 的方式:

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 甚至提供了一个关于如何使用管道的示例,但我并不真正理解它。该示例还使用了 Windows 上不可用的 grep。

例子

我还发现这个例子更难理解。

知道如何使用 tqdm 获取和解析 7zip 提供的信息吗?

4

1 回答 1

1

要使用tqdm进度条,您可以简单地使用参数实例化进度条,如此total所做,然后调用(如此处所完成)传递进度条上的增量。您还可以指定总数以字节为单位,并且您想用and来显示它updateunit='B'unit_scale=True

使用 7zip 可以分三个步骤完成:

  1. 通过调用7z l {zip file name},您可以获得文件的大小及其名称,因此脚本可以调用命令并解析输出。最近 Python 版本的推荐方法是通过subprocess模块。

  2. 用未压缩文件的总最终大小实例化 tqdm 对象

  3. 使用subprocess.Popen你可以调用['7z', 'x', '-bd', filename]-bd避免内置进度报告),并通过使用where process 是返回的值stdout=subprocess.PIPE来读取进程的标准输出,并解析输出以获取当前状态。文件解压后会报告其名称,因此您可以使用在步骤 1 中检索到的相对大小进行调用。process.stdout.readline()Popentqdm.update

于 2018-11-23T13:30:42.683 回答