В операционных системах (Linux, macOS, Windows) каждому запущенному процессу по умолчанию открываются два выходных потока:
1. Standard Output (stdout): Сюда идет основной результат работы программы.
2. Standard Error (stderr): Сюда идут ошибки, предупреждения и диагностические сообщения.
В модуле
sys эти потоки представлены как файлоподобные объекты. Функция print — это просто удобная обертка над ними.🔛 Обычный вывод:
print("Hello") или sys.stdout.write("Hello\n")🔛 Вывод ошибки:
print("Error!", file=sys.stderr) или sys.stderr.write("Error!\n")🛠 Зачем разделять потоки
Главная причина — перенаправление (redirection). Представьте, что ваш скрипт обрабатывает 1000 файлов и записывает результат в лог. Если произойдет ошибка на 500-м файле, и вы пишете всё в один поток, ошибка «потеряется» внутри огромного текстового файла.
Примеры команд в терминале:
🔛
python script.py > output.txt — в файл попадет только stdout. Ошибки (stderr) по-прежнему будут видны на экране.🔛
python script.py 2> errors.txt — на экране будет результат, а все ошибки уйдут в отдельный файл.🔛
python script.py > all.txt 2>&1 — классический способ «склеить» потоки и записать всё в один файл.💡 Когда стоит использовать stderr
Трей правильно замечает: stderr — это не только для критических ошибок. Используйте его для:
1. Tracebacks: Python сам пишет сюда дампы ошибок при падении.
2. Warnings: Модуль
warnings использует этот поток.3. Progress Bars: Если вы рисуете индикатор загрузки (например, через `tqdm`), лучше выводить его в stderr, чтобы он не засорял основной вывод данных.
4. Interactive Prompts: Вспомогательный текст (вроде приветствия в REPL) часто идет в stderr.
🏁 Практический совет
Если вы пишете CLI-утилиту, которой будут пользоваться другие люди (или ваши же скрипты):
> Всегда отправляйте полезные данные (те, что можно передать по цепочке другому скрипту через `|`) в stdout, а любые пояснения, логи и ошибки — в stderr.
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст