Какой смысл "stderr" в Python? - PullRequest
0 голосов
/ 12 июня 2018

Я новичок в программировании и пытаюсь понять, как работают stdin, stdout и stderr.Насколько я понимаю, stdout и stderr - это два разных места, где мы можем направлять вывод из программ.Наверное, я не понимаю, какой смысл иметь второй «поток» вывода только для ошибок с stderr?Почему бы не иметь ошибки на обычной stdout?Что позволяет делать ошибки на stderr (в основном, почему stderr полезен)?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

В UNIX (и Linux, и других Posix-совместимых системах) программы часто объединяются с конвейерами, так что одна программа принимает выходные данные другой в качестве входных данных.Если бы вы смешали нормальный вывод и информацию об ошибках, каждая программа должна была бы знать, как обрабатывать диагностическую информацию от своего производителя данных канала в отличие от обычных данных.На практике это невозможно из-за большого количества комбинаций программ.Записывая информацию об ошибках в stderr, каждая программа позволяет пользователю получить эту информацию без необходимости отфильтровывать ее из потока данных, предназначенного для чтения следующей программой в канале.

0 голосов
/ 12 июня 2018

Есть две «точки» для поддержки различных потоков stout и stderr:

  1. Когда вы пишете приложения, которые можно объединить в цепочку (например, с помощью конвейеров), вы не хотите«нормальный» вывод, чтобы перепутать с ошибками, предупреждениями, отладочной информацией и прочим «чатом».Смешивание их в одном потоке усложнит жизнь следующей программе в цепочке / конвейере.

    Пример:

     $ cat some-file | grep not
     $ echo $?
    

    Если команда cat не записывает свои сообщения об ошибках вstderr, тогда команда grep увидит сообщение "file not found", если "some-file" не существует.Тогда он (неверно) совпадет с «not» и неверно установит код возврата для конвейера.Построение конвейеров, которые бы справлялись с такими вещами, было бы чертовски сложно .

  2. Отдельные потоки stdout и stderr поддерживались (по крайней мере) в UNIX и UNIX-подобныхСистема с ... ммм ... 1970-х годов.И они являются частью стандарта POSIX.Если библиотеки времени выполнения нового языка программирования не поддерживают это, то это будет считаться поврежденным;т.е. не подходит для написания качественных приложений.

    (В истории языков программирования Python все еще относительно нов.)

Однако никто не заставляет писать ваши приложения для использования stderr по прямому назначению.(Ну ... может быть, ваши будущие коллеги будут :-))

...