5

program.py に次のコードがあります。

from sys import stdin
for line in stdin:
    print line

Ctrl実行し、行を入力してから+を押しますDが、プログラムは終了しません。

これは機能します:

$ printf "echo" | python program.py 

Ctrl+を押してもプログラムが終了しないのはなぜdですか? Fedora 18 ターミナルを使用しています。

4

1 に答える 1

15

Ctrl+D奇妙な効果があります。入力ストリームを閉じませんが、C レベルfread()が空の結果を返すだけです。通常のファイルの場合、このような結果はファイルが最後に達したことを意味しますが、他の誰かがその間にファイルにさらにデータを書き込んだかどうかを確認するなど、さらに読み取ることは許容されます。

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

  • ファイルに対する Python の反復は、ブロック バッファリングを行います。対話型ストリームから読み取ることは避けてください。

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

  • ターミナル自体 (!) は、デフォルト モード (「クック モード」) で、プロセスに送信する前に 1 行のデータを読み取りCtrlますD

Ctrlこの例では、最初の問題を回避します。これは、 +Dを独自の行として入力したことを検出することだけが必要な場合に必要なすべてです。

import sys

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

'\n'「行」がCtrl+から来ている場合を除いて、すべての行を finalでD取得し''ますif line == '': break

于 2013-03-27T20:29:44.827 に答える