【问题标题】:Show progressbar using tqdm from 7zip subprocess pipe使用 7zip 子进程管道中的 tqdm 显示进度条
【发布时间】:2018-06-05 13:24:45
【问题描述】:

我正在使用此功能(基于this 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。

我还发现了this example,这更难理解。

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

【问题讨论】:

    标签: python python-3.x progress-bar 7zip tqdm


    【解决方案1】:

    要使用tqdm 进度条,您可以简单地使用参数total 实例化进度条,就像here 一样,然后调用update (as done here) 传递增量 在吧台上。您还可以指定总数以字节为单位,并且您想用unit='B'unit_scale=True 显示它

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

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

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

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

    【讨论】:

    • 我不是在尝试解压缩,我是在尝试获取压缩的进度。
    • @Jacopofar 不是在进程完成 时返回stdout,而不是在进程进行的同时返回?
    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多