2009-07-05 3 views
3

システムプロセスを実行し、出力をインターセプトし、Pythonスクリプトで行ごとにリアルタイムで変更したいと思います。Pythonの別のプロセスからのstdoutのリアルタイムインターセプト

印刷前に完了するために、プロセスを待ち私の最高の試み、次のとおりです。

#!/usr/bin/env python 
import subprocess 

cmd = "waitsome.py" 
proc = subprocess.Popen(cmd, shell=True, bufsize=256, stdout=subprocess.PIPE) 
for line in proc.stdout: 
    print ">>> " + line.rstrip() 

スクリプトwaitsome.pyは単に半秒毎の行を出力します。

#!/usr/bin/env python 
import time 
from sys import stdout 

print "Starting" 
for i in range(0,20): 
    time.sleep(0.5) 
    print "Hello, iteration", i 
    stdout.flush() 

は使いやすいがありますソリューションをsubprocessにリアルタイムで出力を反復できるようにするには?スレッドを使用する必要がありますか?

は昔、私はPerlでスクリプト、これはケーキの一部だった:ファイルの上にループ

open(CMD, "waitsome.py |"); 
while (<CMD>) { 
    print ">>> $_"; 
} 
close(CMD); 
+0

重複:http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+real-time、特にhttp://stackoverflow.com/questions/527197/intercepting-stdoutとしてalledサブプロセス中に実行中です。http://stackoverflow.com/questions/803265/getting-realtime-output-using-subprocess –

+0

申し訳ありませんが、私は最初のものだけを見て、それを理解しました。 *サブプロセスの*バッファリングに関する問題であり、親のPythonスクリプトの問題ではありません。 –

答えて

13

は避けられないかなり大きな塊で物事をバッファ - 全てのPython 2の既知の問題を。 *実装。あなたは、Python 3.1で意図したとおり、それは最後のループがわずかに異なるもので、動作します(!と私はそれが頻繁になります知っている)

for line in proc.stdout: 
    print(">>> " + str(line.rstrip())) 

のPython 3.1へのアップグレードは非現実的である場合は、他の道を行くと、ループを書きます昔ながらのやり方で - あなたは、Python 2で意図したとおり、ループの次のバージョンは、作業を行う*:

def subprocess_readlines(out): 
    while True: 
     line = out.readline() 
     if not line: 
      return 
     yield line 

while True: 
    line = proc.stdout.readline() 
    if not line: 
     break 
    print ">>> " + line.rstrip() 
+0

これはPython 3.0でも動作します – Stephan202

+1

しかし、Python 3.1が(I/Oスタック全体の実装がはるかに優れているので)3.0に固執する理由はありません(これは間違いなく移行版でした;-)。 –

+1

'for line in iter(proc.stdout.readline、 ''):print" >>> "、line、'はPython 2のwhileループの代わりに使用できます。 – jfs

0

この全体のことはようイテレータにカプセル化することができますそして、c

for line in proc.stdout: 
    print ">>>", line.rstrip() 
+0

Pythonのバッファリングは、元の質問:)はい、いくつかの行で行うことができるPython 2.5のために多くの努力を払った。 –

関連する問題