В некоторых редких случаях вам может быть важно, к чему подключен stdin. В основном, тебе все равно - ты просто читаешь stdin.
В someprocess | python myprogram.py
стандартный ввод подключен к трубе; в этом случае стандартный вывод предыдущего процесса. Вы просто читаете из sys.stdin
, а вы читаете из другого процесса. [Обратите внимание, что в Windows все еще есть (потенциально) устройство «CON» с клавиатурой. Это просто не будет sys.stdin
.]
В python myprogram.py <someFile
stdin подключен к файлу. Вы просто читаете из sys.stdin
и читаете из файла.
В python myprogram.py
стандартный вывод остается подключенным к консоли (/dev/ttyxx
в * nix). Вы просто читаете с sys.stdin
и читаете с клавиатуры.
Обратите внимание на общую тему в вышеупомянутых трех случаях. Вы просто читаете из sys.stdin
, и среда вашей программы определяет все для вас. Вы не проверяете «чтобы увидеть, доступны ли данные на stdin для чтения». Это уже доступно.
Иногда требуется прерывание клавиатуры (или другие махинации). В Python, кстати, прерывание клавиатуры является первоклассной функцией элементов ввода / вывода. Control-C вызывает прерывание во время ввода-вывода (оно не прерывается в узком цикле, но будет сигнализировать программе, которая печатает периодически.)
Иногда вам нужно выяснить, к какому файлу stdin
подключен.
Что-то вроде os.isatty( sys.stdin.fileno() )
Если sys.stdin
- это TTY, ваша программа осталась подключенной к окнам "CON" (клавиатура). Если sys.stdin
не TTY, он подключен к файлу или каналу.
Пример * * одна тысяча тридцать одна
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
C:\Documents and Settings\slott>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import sys
>>> os.isatty( sys.stdin.fileno() )
True
>>>
Значение True
говорит мне, что Python работает без прикрепленного файла или канала. sys.stdin
это клавиатура. Использование windows kbhit
не нужно.
Значение False
говорит мне, что Python работает с прикрепленным файлом или каналом. sys.stdin
это НЕ клавиатура. Проверка kbhit
может иметь смысл. Кроме того, я мог бы открыть устройство CON:
и сразу прочитать клавиатуру, отдельно от sys.stdin
.
Я не уверен, почему вам нужно "посмотреть, доступны ли данные на stdin для чтения". Это может помочь обновить ваш вопрос дополнительными сведениями о том, что вы пытаетесь выполнить.