コマンド ライン プログラム (svnadmin verify) のラッパー スクリプトを作成しようとしています。これには、ラップされたプログラムが出力されるとすぐに、出力の各行を確認できる必要があります。
subprocess.Popen
、 useを使用してプログラムを実行し、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', '')
subprocess のドキュメントを少し見たところ、bufsize
パラメータがPopen
にあることがわかりました。そのため、bufsize を 1 (行ごとにバッファリングする) と 0 (バッファなし) に設定してみましたが、どちらの値でも行の配信方法が変わるようには見えませんでした。
この時点で、私はストローをつかみ始めていたので、次の出力ループを書きました。
while True:
try:
print p.stdout.next().replace('\n', '')
except StopIteration:
break
しかし、同じ結果が得られました。
サブプロセスを使用して実行されたプログラムの「リアルタイム」プログラム出力を取得することは可能ですか? Python に前方互換性がある (ないexec*
) 他のオプションはありますか?