Текст трубы в Python script или подсказка

Я пытаюсь написать очень простое электронное письмо script в python. Это в основном бедный человек. На работе мы отправляем много данных с серверов по всему миру, и было бы намного проще отправить их непосредственно с сервера.

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

$ cat message.txt | emailer.py [email protected]
$ tail -n 2000 /var/log/messages | emailer.py [email protected]

Оба из них достаточно просты. Я могу просто sys.stdin.read() и получить мои данные.

Проблема, с которой я столкнулась, заключается в том, что я также хочу поддержать приглашение для ввода сообщения со следующим использованием:

emailer.py --attach-file /var/log/messages [email protected]

Enter Your message. Use ^D when finished.
>>   Steve,
>>   See the attached system log. See all those NFS errors around 2300 UTC today.
>>
>>   ^D

Проблема, с которой я столкнулась, заключается в том, что если я пытаюсь sys.stdin.read(), и нет данных, тогда моя программа блокирует, пока stdin не получит данные, но я не могу распечатать приглашение. Я мог бы сделать безопасный подход и использовать raw_input("Enter Your message. Use ^D when finished.") вместо stdin.read(), но затем всегда распечатываю приглашение.

Есть ли способ увидеть, что пользователь отправил текст в python без использования метода, который будет блокироваться?

Ответ 1

Вы можете использовать sys.stdin.isatty, чтобы проверить, выполняется ли script в интерактивном режиме. Пример:

if sys.stdin.isatty():
    message = raw_input('Enter your message ')
else:
    message = sys.stdin.read()