2011-10-18 13 views
2

私はpythonでstdoutの読み方に問題があります。私は何をしようとしているのか少し説明しなければならない。別のプログラムのあるプログラムからstdoutを読み込む

私はPythonプログラム(foo)を持っています。これは第2のpythonプログラム(bar)を呼び出します。 バーは、ステータス出力の詳細やログに記録されるその他の情報を返します。 fooはこれを読まなければなりません。原理的には機能します。 バーの出力を取得して問題なくログファイルに送信できます。問題は、出力のあるフレーズをバー(ステータスレポート)から探すときに始まります。

私はos.read(FN、n)はバーの標準出力からで出力を読んでいます。問題は、os.readはnバイトを読み取りますが、行は読み取れません。それは多かれ少なかれ可能性があります。私はそれがバーによって標準出力に書き込まれているすべての行を読みたい、これらの行は\ nで終わると、どちらかsys.stdout.flush続い印刷またはとsys.stdout.write(と書かれています)。使用バー呼び出す

fooが:

bar= subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
fd_in[0] = bar.stdout.fileno() 
fd_in[1] = bar.stderr.fileno() 

私のコードは、現時点ではこのようになります。 バーは書き込み:

int_logFile.write(buf) 
int_logFile.flush() 

すべてがうまくている:私は

buf = os.read(fd_in[0], 256) 

fooのに読んでいます

print 'TAG INFO1 INFO2 INFO3' 
#or 
sys.stdout.write('TAG INFO1 INFO2 INFO3\n') 
sys.stdout.flush() 

私はとのログファイルにこれを書いたとき。私はこのような出力行の最初の単語つかむしたいなら:

tokens = buf.strip('\n').split(' ') 

を私はタグを得ることはありませんので、私は、misseryで終わるが、私はINFOXまたは実行する前の出力何から何かを持っているかもしれません私のステータスメッセージ。

これを要約すると、バーの行をfooに読み込む必要があります。何か案は???

+0

bar.communicateを試しましたか? – spicavigo

答えて

2

Er、bar.stdout.readline()?ファイルディスクリプタへの移動はほとんど必要ありません。

+0

私はこれを信じていません。私はすべての午後に 'bar.stdout.readlines()'を試していてどこにも行きませんでした。それはよく分かります**簡単です** ;-) –

0

Popen.communicate?また、これにより、必要に応じてプロセスに入力を送信することもできます。

+0

はい、しかし、私も通信することができますが、私はかなりshureではないプロセスからの出力を受け取りたいと思います。プロセスが終了したときに出力します。これは私のニーズに合わないものです。 'readline'の使い方は、私のために現時点ではやっています。しかし、入力をありがとう。 –

関連する問題