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

Как определить, перенаправляется ли sys.stdin из файла или из другого процесса?

В простом Python script, предназначенном для запуска из оболочки, могу ли я уверенно определить, был ли sys.stdin перенаправлен из фактического файла или потокового из другого процесса?

Я хочу изменить поведение во время выполнения в зависимости от того, идет ли stdin из файла данных или потоковой передачи из другого процесса через канал.

Как и ожидалось, isatty() возвращает False в обоих случаях. Вот быстрый тест isatty():

# test.py
import os
import sys
print sys.stdin.isatty()
print os.isatty(sys.stdin.fileno())

Тестирование:

python test.py < file.txt

дает:

False
False

и

ls -al | python test.py

дает:

False
False

Есть ли питонический метод для этого?

Спецификация Unix/Linux в порядке, хотя было бы неплохо узнать, можно ли это сделать переносимым образом.

Изменить: Примечание в ответ комментаторам: Почему меня это волнует? Ну, в моем случае я хочу иметь дело с данными с меткой времени, которые поступают с нерегулярными интервалами, когда они передаются из другого процесса; когда я воспроизвожу предварительно записанные данные из файла, я хотел бы воспроизвести его с помощью фиксированных или переменных задержек.

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

4b9b3361

Ответ 1

Вы ищете макросы stat:

import os, stat

mode = os.fstat(0).st_mode
if stat.S_ISFIFO(mode):
     print "stdin is piped"
elif stat.S_ISREG(mode):
     print "stdin is redirected"
else:
     print "stdin is terminal"