Перенаправить вывод программы на экран и в файл одновременно

Перенаправить вывод программы на экран и в файл одновременно

У меня есть скрипт Python. Я хочу сохранить его результат, пока он выводит что-то в терминал. Я пробовал

python program.py 2>&1 | tee output.txt

Однако, похоже, что только после завершения программы она выведет все на экран. Пока она работает, вывода нет. Это меня действительно беспокоит, так как я хочу знать ход выполнения программы. Есть ли способы вывода на экран и в файл одновременно?


Обновление 13 ноября 2019 г.

Спасибо за помощь @egmont. Любой, кто сталкивается с той же проблемой, может попробовать следующие команды. Это выведет на экран и запишет в файл одновременно.

stdbuf -oL python program.py 2>&1 | tee ouput.txt

решение1

Я столкнулся с той же проблемой («все», что связано с манипуляциями stdout, например nohup, фоновый режим ( &) или перенаправление). Интересно, что stdbuf -oLэто не решило проблему. Но оказалось, что и Python 2, и Python 3 (из каких подверсий, я не знаю, извините) поддерживают опцию, -uкоторая делает stdoutи stderrнебуферизованными. Смотритеhttps://www.commandlinux.com/man-page/man1/python2.7.1.html.

Я только что заметил (согласно этой странице руководства), что в Python 2.7 stdinтакже реализована небуферизация, тогда как страница руководства для Python 3 (3.10 для меня) специально говорит:"This option has no effect on the stdin stream."

Итак, первоначальная команда ОП будет выглядеть так:

python -u program.py 2>&1 | tee output.txt

Затем я получаю поведение, которое ожидаю от PHP / awk / и т. д.

Поскольку автор вопроса спросил «Есть ли способы одновременного вывода на экран и в файл?», это «решение» опирается на teeто, что автор вопроса уже вывел — ему просто нужно python -uобеспечить более привычное поведение.

Связанный контент