1

64ビットのWindows 7でpython 2.7を実行しています。

ここに私が実行しているコードがあります:

import sys
while True:
    print 'please enter a character:'
    c = sys.stdin.read(1)
    print 'you entered', str(c)

Eclipse の PyDev 環境では、入力 a と b に対して次の出力が得られます。

please enter a character:
a
you entered a
please enter a character:
you entered 
please enter a character:
you entered 

please enter a character:
b
you entered b
please enter a character:
you entered 
please enter a character:
you entered 

please enter a character:

入力を 1 回正しく取得してから、ユーザー入力をスキップして 2 回実行します。

ここで、入力 a および b に対して Python ターミナルで同じコードを実行すると、次の出力が得られます。

enter char
a
you entered a
enter char
you entered

enter char
b
you entered b
enter char
you entered

enter char

これは、ユーザー入力を 1 回取得し、ユーザー入力をスキップして 1 回実行されます。

この問題の原因は何ですか? Python が無限ループで一度に 1 文字ずつ読み取れるようにするにはどうすればよいですか?

4

2 に答える 2

3

問題はおそらく stdin が残っているため、stdin のフラッシュによるもの\nです。

代わりに、使用raw_input

while True:
    c = raw_input('please enter a character: ')
    print 'you entered', c

フラッシング部分はこちら

于 2013-03-17T19:28:07.820 に答える
2

sys.stdinデフォルトでは行バッファリングされています。つまり、標準入力バッファに完全な行sys.stdin.read(1)があるまで戻りません。

文字を入力してヒットするEnterと、 で最初の文字を取得した後sys.stdin.read(1)、バッファーに改行 (1 つまたは 2 つの文字: os.linesep) があり、次のループ反復ですぐに読み取られます。

一度に 1 文字ずつ正確に読み取ることで、ヒットを回避できますEnter( ) 。msvcrt.getch()

于 2014-04-07T19:18:23.480 に答える