У меня есть скрипт 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
обеспечить более привычное поведение.