2012-01-22 9 views
3

私はPythonにいくつか問題があります。私は実行中のスクリプトから出力を得て、別のスクリプトで使用しようとしています。だから、私がしたいことは、このようなものです。Pythonで実行中のスクリプトからstdoutを読む

out.pyin.pyがこれらのようになっているとします。私はこのようなスクリプトを実行したい

# out.py 
def main(): 
    while True: 
     print "test" 
     time.sleep(10) 
main() 

# in.py 
text = sys.stdin.readline() 
print "hello " + text 

$ python out.py | python in.py 

しかし、これはハングし、「ハローテスト」10秒ごとに印刷する代わりに、何も出力しません。これから、私はout.pyが終了するまで|が待つことを推測しています。さて、デーモンでin.pyを使用したいのですが?

私の実際の問題は次のとおりです。 arpwatchから出力を取得しようとしています。 arpwatchはデーモンとして実行され、ip/macペアをstderrに送信します。私はその出力を取得し、それを解析したい。そう、私はこのようなものが必要です。

$ arpwatch | python myscript.py 

どのように私はmyscript.pyをコーディングする必要があり、これをachiveするには?私はsubprocess module,を使用しようとしましたが、私は再び成功しませんでした。私の英語がまともでないので、私が問題を明確に説明できることを願っています。

ありがとうございました。

答えて

4

問題はバッファリングの問題です。

import sys 
import time 

def main(): 
    while True: 
     print "test" 
     sys.stdout.flush() 
     time.sleep(10) 
main() 

残念ながら、あなたはこの自分自身をやってarpwatchに依存する必要があります;:あなたはout.pyで明示的にフラッシュをstdout場合が消えますそうでない場合は、パイプの代わりにPTYsを試してみてください。ターミナルとしてカウントされ、ほとんどのアプリケーションでブロックバッファリングの代わりにラインバッファリングが使用されるためです。

+0

このような迅速な返信をいただきありがとうございます。魅力的な作品:) arpwatchのためのptyを見ていきます。 –

+1

@MuhammetCan:どうぞよろしくお願いいたします。 'pexpect'について私が言ったことは忘れてしまいました。プロセスの標準出力だけを読むときは必要ありません。 'pty'モジュールで十分です。 –

関連する問題