Подтвердить что ты не робот

Каков наилучший способ узнать, есть ли у программы Python что-нибудь для чтения из stdin?

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

cat something | my_program.py

и делать что-то другое, если это работает

my_program.py

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

4b9b3361

Ответ 1

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

$ python -c 'import sys; print sys.stdin.isatty()'
True
$ echo | python -c 'import sys; print sys.stdin.isatty()'
False

Ответ 2

Вы хотите выбрать модуль (man select в unix). Это позволит вам проверить, есть ли что-нибудь читаемое на stdin. Обратите внимание, что 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>]

Ответ 3

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

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

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

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

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

Ответ 4

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

Это может быть Unix OS, специфичная и различная для Windows Python.