Перенаправить вывод программы на экран и файл одновременно
У меня есть скрипт на Python. Я хочу сохранить его результат, пока он выводит что-то в терминал. я пытаюсь
python program.py 2>&1 | tee output.txt
Кажется, только после завершения программы, он будет печатать все вещи на экране. Во время бега ничего не выводится. Это действительно беспокоит меня, я хочу знать прогресс во время выполнения программы. Есть ли способы вывода на экран и в файл одновременно?
Обновление 13 ноября
Спасибо за помощь от @egmont. Любой, кто сталкивается с той же проблемой, может попробовать следующие команды. Он выведет на экран и запишет в файл одновременно.
stdbuf -oL python program.py 2>&1 | tee ouput.txt
1 ответ
У меня была та же проблема («все», что связано с манипулированием, напримерnohup
, фон (&
) или перенаправление). Для меня интересно,stdbuf -oL
не решил проблему. Но оказывается, что и Python 2, и Python 3 (из каких именно подверсий, извините, не знаю) поддерживают-u
вариант, который делаетstdout
иstderr
небуферизованный. См. https://www.commandlinux.com/man-page/man1/python2.7.1.html.
Я только что заметил (согласно этой странице руководства), что в Python 2.7stdin
также сделан без буферизации, тогда как на странице руководства 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
чтобы дать более знакомое поведение.