将程序输出同时重定向到屏幕和文件

将程序输出同时重定向到屏幕和文件

我有一个 Python 脚本。我想在它在终端中输出某些内容时保存其结果。我试过

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

但是,似乎只有在程序完成后,它才会在屏幕上打印所有内容。运行时,没有任何输出。这真的让我很困扰,因为我想知道程序运行时的进度。有没有办法同时输出到屏幕和文件?


2019 年 11 月 13 日更新

感谢@egmont 的帮助。遇到同样问题的人可以尝试以下命令。它将在屏幕上输出并同时写入文件。

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

答案1

我遇到了同样的问题(“任何涉及操作的事情” stdout——例如nohup,后台运行(&)或重定向)。有趣的是,对我来说,stdbuf -oL并没有解决问题。但事实证明,Python 2 和 3(我不知道来自哪个子版本,抱歉)都支持一个-u选项,它使stdoutstderr无缓冲。请参阅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."

因此,OP 的原始命令将变成:

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

然后我得到了我期望的 PHP / awk / 等的行为。

正如 OP 所问的“有没有办法同时输出到屏幕和文件?”,这个“解决方案”依赖于teeOP 已经推断出的方案——它只需要python -u给出更熟悉的行为。

相关内容