4

当 7zip 从命令行运行时,它将使用一系列 '%' 符号打印一个进度条。

从 Python 中执行 7zip 时,我想同时捕获和打印这个进度条。我该怎么做呢?

我目前使用的 Python 代码:

from subprocess import Popen, PIPE
pipe = Popen('7za.exe a -tgzip "e:\\backup\\sch Testerr 2012 06 23 17-27.gzip" "E:/archiv"' , stdout=PIPE)
text = pipe.communicate()[0]
print text
4

3 回答 3

1

来自communicate(强调我的):

从 stdout 和 stderr 读取数据,直到到达文件结尾。等待进程终止。

考虑poll改用:

from subprocess import Popen, PIPE
pipe = Popen('7za.exe a -tgzip "e:\\backup\\sch Testerr 2012 06 23 17-27.gzip" "E:/archiv"', stdout=PIPE)
while True: # Feeling fancy?  add a timeout condition here...
    if pipe.poll():
        break
    # consider reading from stdin and printing as your needs indicate
于 2012-06-30T02:39:45.530 回答
1

你想要的是 sys.stdout.flush()。

但是,您可能需要在单独的线程上执行刷新,因为主线程可能会被阻塞,直到 Popen 中的底层进程完成。

编辑:使用布赖恩的回答来帮助(并避免多线程),我设想了一个这样的解决方案:

from subprocess import Popen, PIPE
pipe = Popen('7za.exe a -tgzip "e:\\backup\\sch Testerr 2012 06 23 17-27.gzip" "E:/archiv"' , stdout=PIPE)

# Assuming Python thread continues after POpen invoke (but before 7za is finished)
while (not pipe.poll()):
    sys.stdout.flush()
    time.sleep(1)
于 2012-06-30T02:28:42.833 回答
1

我发现 7za 在重定向标准输出时会抑制进度输出。
所以,我写了一个补丁。
'sopg' 选项即使在 stdout 被重定向或管道传输时也启用进度输出。 https://github.com/photom/p7zip/commit/2baacd6c354fbde19ebc83d185e73f6d9bd62517

$ 7za x -sopg ..7z

于 2016-12-02T12:13:39.483 回答