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

必要なのは 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

から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

stdout がリダイレクトされると、7za が進行状況の出力を抑制することがわかりました。
ということで、パッチを書きました。
'sopg' オプションは、stdout がリダイレクトまたはパイプされた場合でも進行状況の出力を有効にします。 https://github.com/photom/p7zip/commit/2baacd6c354fbde19ebc83d185e73f6d9bd62517

$ 7za x -sopg ..7z

于 2016-12-02T12:13:39.483 に答える