私のpythonスクリプトはサブプロセスを使用して、非常にうるさいlinuxユーティリティを呼び出します。すべての出力をログファイルに保存し、その一部をユーザーに表示します。次の方法でうまくいくと思いましたが、ユーティリティが大量の出力を生成するまで、出力はアプリケーションに表示されません。
#fake_utility.py, just generates lots of output over time
import time
i = 0
while True:
print hex(i)*512
i += 1
time.sleep(0.5)
#filters output
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
for line in proc.stdout:
#the real code does filtering here
print "test:", line.rstrip()
私が本当に望んでいる動作は、フィルタースクリプトがサブプロセスから受け取った各行を出力することです。Sortaは何をするのかtee
が好きですが、Pythonコードを使用しています。
何が欠けていますか?これは可能ですか?
更新:
a sys.stdout.flush()
がfake_utility.pyに追加された場合、コードはPython 3.1で望ましい動作をします。Python 2.6を使用しています。を使用proc.stdout.xreadlines()
するとpy3kと同じように機能すると思いますが、そうではありません。
アップデート2:
これが最小限の作業コードです。
#fake_utility.py, just generates lots of output over time
import sys, time
for i in range(10):
print i
sys.stdout.flush()
time.sleep(0.5)
#display out put line by line
import subprocess
proc = subprocess.Popen(['python','fake_utility.py'],stdout=subprocess.PIPE)
#works in python 3.0+
#for line in proc.stdout:
for line in iter(proc.stdout.readline,''):
print line.rstrip()
print line,
代わりに使用できますprint line.rstrip()
。