Как лучше всего определить, есть ли в программе на Python что-либо для чтения со стандартного ввода? - PullRequest
32 голосов
/ 31 марта 2009

Я хочу, чтобы программа выполняла одну вещь, если она выполняется так:

cat something | my_program.py

и сделай другую вещь, если беги так

my_program.py

Но если я читаю со стандартного ввода, тогда он будет ждать ввода данных пользователем, поэтому я хочу посмотреть, есть ли что-то, что можно прочитать, прежде чем пытаться читать со стандартного ввода.

Ответы [ 4 ]

61 голосов
/ 31 марта 2009

Если вы хотите определить, передает ли кто-то данные в вашу программу или запускает ее в интерактивном режиме, вы можете использовать isatty, чтобы узнать, является ли stdin терминалом:

$ python -c 'import sys; print sys.stdin.isatty()'
True
$ echo | python -c 'import sys; print sys.stdin.isatty()'
False
8 голосов
/ 31 марта 2009

Требуется модуль выбора (man select в unix). Он позволит вам проверить, есть ли что-то читаемое на стандартном вводе. Обратите внимание, что select не будет работать в Window с файловыми объектами. Но из вашего загруженного вопроса я предполагаю, что вы работаете в ОС на основе Unix:)

http://docs.python.org/library/select.html

root::2832 jobs:0 [~] # cat stdin_test.py
#!/usr/bin/env python
import sys
import select

r, w, x = select.select([sys.stdin], [], [], 0)
if r:
    print "READABLES:", r
else:
    print "no pipe"

root::2832 jobs:0 [~] # ./stdin_test.py
no pipe

root::2832 jobs:0 [~] # echo "foo" | ./stdin_test.py
READABLES: [<open file '<stdin>', mode 'r' at 0xb7d79020>]
2 голосов
/ 31 марта 2009

Плохие новости. С точки зрения командной строки Unix эти два вызова вашей программы идентичны.

Unix не может их легко отличить. То, что вы просите, не очень разумно, и вам нужно подумать о другом способе использования вашей программы.

В случае, когда он не находится в конвейере, что он должен читать, если не читает stdin?

Должен ли он запускать графический интерфейс? Если это так, вы можете использовать опцию "-i" (--interactive), чтобы указать, что вам нужен графический интерфейс, а не чтение стандартного ввода.

Иногда вы можете отличить каналы от консоли, поскольку консольное устройство - "/ dev / tty", но это не переносимо.

0 голосов
/ 31 марта 2009

Я не знаю, как работают команды Python, но вы должны быть в состоянии сделать что-то с опросом или выбрать поиск данных, готовых для чтения на стандартном вводе.

Это может быть специфично для ОС Unix и отличаться в Windows Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...