Как проверить, есть ли в stdin какие-либо данные? - PullRequest
50 голосов
/ 21 сентября 2010

В Python как проверить, есть ли у sys.stdin данные или нет?

Я обнаружил, что os.isatty(0) может не только проверять, подключен ли stdin к устройству TTY, но также и наличие данных.

Но если кто-то использует такой код, как

sys.stdin = cStringIO.StringIO("ddd")

и после этого использует os.isatty(0), он все еще возвращает True. Что мне нужно сделать, чтобы проверить, есть ли у stdin данные?

Ответы [ 4 ]

61 голосов
/ 21 сентября 2010

В системах Unix вы можете делать следующее:

import sys
import select

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

В Windows модуль select можно использовать только с сокетами, хотя вам придется использовать альтернативный механизм.

53 голосов
/ 19 июля 2013

Я использую

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 () возвращает false, если в stdin что-то есть.

isatty(...)
    isatty() -> true or false. True if the file is connected to a tty device.
2 голосов
/ 06 июня 2016

(редактировать: это ответ на связанный вопрос, который с тех пор был объединен здесь.)

Как уже упоминалось, нет надежного способа узнать, будут ли данные доступны из stdin, потому что UNIX не позволяетэто (и в более общем плане, потому что он не может угадать будущее поведение любой программы, к которой подключается stdin).

Всегда ждать stdin, даже если ничего не может быть (это то, что делают grep и т. д.),или попросите у пользователя аргумент -.

2 голосов
/ 22 сентября 2010

В зависимости от цели здесь:

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

также может быть полезным.

...