печать против stderr - PullRequest
       34

печать против stderr

27 голосов
/ 02 июня 2009

Есть ли какие-либо конкретные преимущества или недостатки у print или stderr?

Ответы [ 4 ]

84 голосов
/ 02 июня 2009

print может печатать на любом файловом объекте, включая sys.stderr.

print >> sys.stderr, 'Text'

Преимущества использования sys.stderr для ошибок вместо sys.stdout:

  • Если пользователь перенаправил стандартный вывод в файл, он по-прежнему видит ошибки на экране.
  • Он не буферизуется, поэтому, если sys.stderr перенаправлен в файл журнала, существует меньшая вероятность того, что программа может произойти сбой до регистрации ошибки.

Этот ответ написан с учетом Python 2. Для Python 3 используйте взамен print('Text', file=sys.stderr).

34 голосов
/ 02 июня 2009

Это просто две разные вещи. print обычно переходит на sys.stdout. Стоит знать разницу между stdin, stdout и stderr - все они имеют свое применение.

В частности, stdout должен использоваться для нормального вывода программы, тогда как stderr должен быть зарезервирован только для сообщений об ошибках (ненормальное выполнение программы). Существуют утилиты для разделения этих потоков, которые позволяют пользователям вашего кода различать обычный вывод и ошибки.

31 голосов
/ 09 марта 2010

Будьте осторожны: здесь есть некоторые тонкости, в том числе то, собираются ли потоки на интерактивные устройства. Самым большим сюрпризом является то, что в 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)
2 голосов
/ 16 мая 2013

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

Другой способ записи в stderr приведен в следующем примере:

import sys
sys.stderr.write("Error has occurred opening a file!")
...