web-dev-qa-db-ja.com

サブプロセス出力をキャプチャする

Pythonでコマンドを実行するときは、サブプロセスを使用する必要があることを学びました。私が達成しようとしているのは、ffmpegを介してファイルをエンコードし、ファイルが完了するまでプログラム出力を観察することです。 Ffmpegは進行状況をstderrに記録します。

私がこのようなことをしようとすると:

child = subprocess.Popen(command, Shell=True, stderr=subprocess.PIPE)
complete = False
while not complete:
    stderr = child.communicate()

    # Get progress
    print "Progress here later"
    if child.poll() is not None:
        complete = True
    time.sleep(2)

childm.communicate()を呼び出した後、プログラムは続行せず、コマンドが完了するまで待機します。出力を追跡する他の方法はありますか?

25
schneck

子プロセスが戻るまで、communicate()はブロックするため、ループ内の残りの行は、子プロセスの実行が終了した後にのみ実行されます。次のように1文字ずつ読み取らない限り、stderrからの読み取りもブロックされます。

import subprocess
import sys
child = subprocess.Popen(command, Shell=True, stderr=subprocess.PIPE)
while True:
    out = child.stderr.read(1)
    if out == '' and child.poll() != None:
        break
    if out != '':
        sys.stdout.write(out)
        sys.stdout.flush()

これにより、リアルタイムの出力が得られます。ナディアの答えから引用 ここ

27
Vlad the Impala

.communicate() 「ファイルの終わりに達するまで、stdoutとstderrからデータを読み取ります。プロセスが終了するのを待ちます。」

代わりに、child.stderrは通常のファイルと同じです。

1
ephemient