Python打印语句在输出重定向时被缓冲
我在用Python写打印语句。我是这样执行我的脚本的:
python script.py > out.log nohup &
但是打印的内容并不是全部都显示在 out.log
文件里,虽然程序运行结束得还不错。
这行代码是在一个 .sh
文件里,我是通过执行 ./script.sh
来运行的。
更新: 日志确实收到了所有的数据,但只有在打印了特定数量的行之后才会显示出来。看起来是输出被缓冲了。
2 个回答
1
你试过以下方法吗:
- 先不使用重定向,确保所有输出都正常显示
- 直接在命令行中运行,而不是通过脚本来运行
?
这些步骤可能会帮助你更好地找到问题所在。
27
当标准输出(stdout)发送到终端(tty)时,它会按行进行缓冲,也就是说每输出一行就会立即显示。但如果输出被重定向到文件或管道中,它就会进行完全缓冲,这样只有在缓冲区满了的时候,才会定期刷新输出。
如果你希望输出能够立即显示,就需要在每一行后面加上 sys.stdout.flush()
这个调用,或者完全关闭缓冲。想了解如何关闭缓冲,可以参考这个链接:禁用输出缓冲,这里有几种方法:
- 使用
-u
命令行选项- 把
sys.stdout
包装在一个每次写入后都会刷新输出的对象里- 设置环境变量
PYTHONUNBUFFERED
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)