2012-04-10 12 views
1

私はPythonの初心者です。私が求めているものが奇妙に思えば、すみません。私は、標準入力で各行をループし、修正された行をすぐに標準出力に戻したいと思います。主に動作するコードがあります。しかし、私はこの仕事を完全にする方法を知らない。Python - 空でない行の後にReadline Control-Dが機能しないのはなぜですか?

私は私がコントロール-Dを入力する前に、しかし、テキストがある場合、私は二度のコードを与える必要があり、次のコード

新しい行にEOFがある場合は、対話形式これは終了します使用されて
while True: 
    line = sys.stdin.readline() 

    if not line: 
     break 

    sys.stdout.write(line) 

を持っています行を終了する前に、もう一度ループが終了する前にもう一度実行してください。

どうすればこの問題を解決できますか。

+1

潜在的なEOFのために 'line'の内容をテストする必要があります – njzk2

+0

実際にコードを実行しましたか?私はあなたが間違っているべきだと思う。 – hochl

+0

はいコードを実行しました。私はそんなにうそではない。 – ashaw

答えて

1

Pythonのドキュメントで提案されている戦略は次のとおりです。

for line in sys.stdin: 
    sys.stdout.write(line) 

IO Tutorialを参照してください。

+0

私はこれを明確にしませんでした。出力を即時にしたいのです。これは、出力が書き込まれるまで入力上のEOFまで待機します。 – ashaw

+0

これは実際には本当に興味深い質問です。あなたのコードは「正しい」、それはちょうどあなたに正しい入力を与えるインタラクティビティを得ることの問題です。 – mfrankli

2

私はhereから私の答えはすぐにコピーすることができると思う:

It has to do with ^D really does: it just stops the current read(2) call.

If the program does int rdbytes = read(fd, buffer, sizeof buffer); and you press ^D inbetween, read() returns with the currently read bytes in the buffer, returning their number. The same happens on line termination; the \n at the end is always delivered.

So only a ^D at the start of a line or after another ^D has the desired effect of having read() return 0 , signalizing EOF.

そしてこの動作はもちろん、同様にPythonのコードに影響を与えます。

+0

ありがとうございます。私はこれを約6回読むまで理解していませんでした。これは私の問題を解決します。 – ashaw