web-dev-qa-db-ja.com

stdinにデータがあるかどうかを確認するにはどうすればよいですか?

Pythonでは、_sys.stdin_にデータがあるかどうかをどのように確認しますか?

os.isatty(0)は、stdinがTTYデバイスに接続されているかどうかを確認できるだけでなく、利用可能なデータがあるかどうかも確認できます。

しかし、誰かが次のようなコードを使用する場合

_sys.stdin = cStringIO.StringIO("ddd")
_

そして、os.isatty(0)を使用した後でも、Trueを返します。 stdinにデータがあるかどうかを確認するにはどうすればよいですか?

51
mlzboy

Unixシステムでは、次のことができます。

import sys
import select

if select.select([sys.stdin,],[],[],0.0)[0]:
    print "Have data!"
else:
    print "No data"

Windowsでは、選択モジュールはソケットでのみ使用できます。そのため、別のメカニズムを使用する必要があります。

64
Rakis

私は使ってきました

if not sys.stdin.isatty()

以下に例を示します。

4 import sys
5
6 def main():
7     if not sys.stdin.isatty():
8         print "not sys.stdin.isatty"
9     else:
10         print "is  sys.stdin.isatty"

>echo "asdf" | stdin.py
not sys.stdin.isatty

sys.stdin.isatty()は、stdinに何かがある場合にfalseを返します。

isatty(...)
    isatty() -> true or false. True if the file is connected to a tty device.
53
liang

ここでの目標に応じて:

import fileinput
for line in fileinput.input():
    do_something(line)

役に立つこともあります。

2
Gregg Lind

(編集:これは、ここに統合された関連する質問に答えます。)

他の人が述べたように、データが標準入力から利用可能になるかどうかを確実に知る方法はありません。UNIXでは許可されていないためです(より一般的には、標準入力に接続するプログラムの将来の動作を推測できないためです)。

何もない(grepなどが行うこともある)場合でも、常にstdinを待つか、ユーザーに-引数。

2
n.caillou