1

通常、次のようなループを使用して、Python でファイルを 1 行ずつ処理します。

import sys
for s in sys.stdin:
    # do something with the line in s

また

import sys
while True:
    line = sys,stdin.readline()
    if len(line) == 0: break
    # process input line

もちろん、次のように raw_input() を使用することもできます。

try:
    while True:
        s = raw_input()
        # process input line
except EOFError:
    # there's EOF.

もちろん、これらすべてのケースで、読み取る準備ができている入力がない場合、基になるread()操作は I/O を待って一時停止します。

私がやりたいのは、中断せずに保留中の入力があるかどうかを確認することです。これにより、入力がなくなるまで読み取ってから、別のことを行うことができます。つまり、次のようなことができるようになりたいです

while "there is input pending":
    #get the input

しかし、保留中の入力がなくなったら、ループを中断します。

4

2 に答える 2

1

さて、これはUNIXでうまく機能するものです:

import sys
import select
import tty
import termios


def isData():
    return select.select([sys.stdin], [], [], 0) == ([sys.stdin], [], [])

old_settings = termios.tcgetattr(sys.stdin)
try:
    tty.setcbreak(sys.stdin.fileno())

    i = 0
    while 1:
        print i
        i += 1

        if isData():
            c = sys.stdin.read(1)
            if c == '\x1b':         # x1b is ESC
                break

finally:
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, old_settings)

もう少し良いテスト プログラムを作成する機会があれば、この回答を変更/拡張します。私は(これまでのところ)Windowsでどれだけうまく機能ttyしているかはっきりしていません。termios

更新:Grmph。これは に依存しselectます。Windows が嫌いな理由があります。

于 2012-06-13T22:32:00.580 に答える
1

Unix の変種を使用していて、標準入力がファイルではなくパイプである場合、selectモジュールを使用して待機中の入力があるかどうかを確認できます。少なくとも、コードは次のようになります。

import select

rlist, wlist, elist = select.select([sys.stdin], [], [])
if rlist:
    s = raw_input()
else:
    pass # no input ready right now
于 2012-06-13T22:07:00.560 に答える