2009-06-08 12 views
16

パイプから行を読み込んで処理しようとしていますが、私は愚かなことをしています。プロデューサーは、このように、無期限のラインを生産保つために起こっている:Python - パイプからの単純な読み込みの行

producer.py

import time 

while True: 
    print 'Data' 
    time.sleep(1) 

は、消費者だけで定期的にラインをチェックする必要があります。

consumer.py

import sys, time 
while True: 
    line = sys.stdin.readline() 
    if line: 
     print 'Got data:', line 
    else: 
     time.sleep(1) 

私はpython producer.py | python consumer.pyとしてWindowsシェルでこれを実行すると、永遠にスリープ状態になります(決してデータを取得しないようですか?)おそらく問題は、私は有限の量のデータを送るとうまく動作するので、決して終了しません。

データを受信して​​消費者に表示するにはどうすればよいですか?実際のアプリケーションでは、プロデューサは制御できないC++プログラムです。

答えて

16

古いバージョンのWindowsでは、ファイルを介してパイプをシミュレートしているため(このような問題が発生する可能性があります)、10年以上も問題はありませんでした。 (python -uを使用して)プロデューサーの標準出力をバッファリングされていないようにしようもprint後にプロデューサーに

sys.stdout.flush() 

を追加してみてください、と。

もちろん、これはプロデューサを制御できない場合には役立ちません。出力があまりにも多くバッファされた場合は、まだ長い時間待つことになります。

は残念ながら - などpyexpect、pexpectexscript、およびparamikoなどのUnixライクなオペレーティングシステム上でその問題を解決するために多くのアプローチがありますが、私はそれらのいずれかがWindows上で動作します疑います。そうですね、私はCygwinを試してみました。これは、WindowsのようなLinuxのようなアプローチをWindowsボックスで使用できるように、Windows上に十分なLinux風のベニアを配置します。

7

これは、デフォルトでPythonでバッファされるI/Oについてです。この動作を無効にするインタプリタに-uオプションを渡します:

python -u producer.py | python consumer.py 

それは私のために問題を修正します。

+0

質問の最後の文章を読んだことがありますか? – jwg

関連する問題