Существуют ли какие-либо конкретные преимущества или недостатки для print
или stderr
?
Print vs stderr
Ответ 1
Это всего лишь две разные вещи. print
обычно переходит в sys.stdout
. Стоит знать разницу между stdin
, stdout
и stderr
- все они используют свои возможности.
В частности, для обычного выхода программы следует использовать stdout
, тогда как stderr
следует резервировать только для сообщений об ошибках (ненормальное выполнение программы). Существуют утилиты для разделения этих потоков, что позволяет пользователям вашего кода различать нормальный выход и ошибки.
Ответ 2
print
может печатать на любом файлоподобном объекте, включая sys.stderr
.
print >> sys.stderr, 'Text'
Преимущества использования sys.stderr
для ошибок вместо sys.stdout
:
- Если пользователь перенаправил stdout в файл, она все еще видит ошибки на экране.
- Он не буферизирован, поэтому, если
sys.stderr
перенаправляется в файл журнала, вероятность того, что программа может произойти сбой до того, как будет зарегистрирована ошибка, меньше.
Этот ответ написан на Python 2.
Для Python 3 используйте print('Text', file=sys.stderr)
.
Ответ 3
Будьте осторожны: здесь есть несколько тонкостей, в том числе, идет ли поток к интерактивным устройствам. Самым большим сюрпризом является то, что в Python 3 stderr работает в режиме буферизации (по крайней мере, в Unix). Например, в окне терминала следующее число раз в две секунды выводится на Python 2:
for n in range(5):
print >> sys.stderr, n, # final comma to squelch newline character
time.sleep(2)
тогда как в Python 3, после завершения цикла завершается печать чисел:
for n in range(5):
print(n, file=sys.stderr, end='') # print n to sys.stderr with no newline char
time.sleep(2)
Ответ 4
Полезно разделять stderr и stdout при запуске script путем перенаправления их на разные файлы. Обычно я использую stderr для сообщений журнала и отслеживаю поток программы, но использую stdout для более полезных сообщений, которые я буду использовать позже.
Другим способом записи в stderr является следующий пример:
import sys
sys.stderr.write("Error has occurred opening a file!")