操作の進行状況インジケーターを表示するコマンドラインプログラム(svnadmin verify)のラッパースクリプトを記述しようとしています。これには、ラップされたプログラムからの出力が出力されるとすぐに、その出力の各行を表示できる必要があります。
私はsubprocess.Popen
、を使用してプログラムを実行し、を使用してstdout=PIPE
、入ってくる各行を読み取り、それに応じて処理するだけだと考えました。しかし、次のコードを実行すると、出力がどこかにバッファリングされているように見え、1行から332行、次に333行から439行(出力の最後の行)の2つのチャンクとして表示されました。
from subprocess import Popen, PIPE, STDOUT
p = Popen('svnadmin verify /var/svn/repos/config', stdout = PIPE,
stderr = STDOUT, shell = True)
for line in p.stdout:
print line.replace('\n', '')
サブプロセスに関するドキュメントを少し調べたところ、へのbufsize
パラメーターを見つけたPopen
ので、bufsizeを1(各行をバッファー)および0(バッファーなし)に設定してみましたが、どちらの値もラインの配信方法を変更するようには見えませんでした。
この時点でストローを把握し始めたので、次の出力ループを作成しました。
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
しかし同じ結果を得た。
サブプロセスを使用して実行されたプログラムの「リアルタイム」プログラム出力を取得することは可能ですか?Pythonには、上位互換性のある(でないexec*
)オプションが他にありますか?
sydout=PIPE
サブプロセスが親プロセスをバイパスして直接コンソールに書き込むように、を省略してみましたか?