我有一个 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
选项,它使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."
因此,OP 的原始命令将变成:
python -u program.py 2>&1 | tee output.txt
然后我得到了我期望的 PHP / awk / 等的行为。
正如 OP 所问的“有没有办法同时输出到屏幕和文件?”,这个“解决方案”依赖于tee
OP 已经推断出的方案——它只需要python -u
给出更熟悉的行为。