2013-03-27 6 views
5

I持ってprogram.pyに次のコード:sys.stdinを

from sys import stdin 
for line in stdin: 
    print line 
私は、 はCtrl + Dを押して行を入力し、実行

が、プログラム終了しません。

これは、作業を行います。私はCtrlキー+Dを押したときに

$ printf "echo" | python program.py 

なぜプログラムが終了しませんか? Fedora 18端末を使用しています。

+0

あなたはどのシェルを使用していますか? – squiguy

+0

ああ、 'CTRL-D'を2回入力する必要があります。 –

+0

'CTRL-D'を2回入力することはできません。 –

答えて

13

Ctrl + には奇妙な効果があります。これは入力ストリームを閉じませんが、Cレベルのfread()は空の結果を返すだけです。通常のファイルの場合、結果はそのファイルが現在終わっていることを意味しますが、それ以上読むことは許容されます。その間に他の誰かがファイルにもっと多くのデータを書き込んでいるかどうかを確認します。

さらに、バッファリングの問題--- 3つのレベルがあります!

  • ファイルに対するPythonの反復は、ブロックのバッファリングを行います。インタラクティブストリームから読み込むのは避けてください。

  • Cレベルのstdinファイルには、デフォルトでラインバッファがあります。

  • 端末自身(!)、そのデフォルトモード(「調理モード」)で、DはありませんCtrlキー + を入力して理由を説明している、プロセスに送信する前に、データの1行を読み込み、行の途中で入力したときの効果。

    import sys 
    
    while True: 
        line = sys.stdin.readline() 
        print repr(line) 
    

    あなたが持つすべての行を取得します:

この例では、あなたが必要とするすべてあなたが望むすべてが独自の行として入力Ctrlキー + Dを検出した場合である第一の問題を回避します最終的には'\n'、「行」がの場合は + Dの場合は、''となります(ただし、我々はif line == '': breakを追加します)。