Python打印语句在输出重定向时被缓冲

14 投票
2 回答
4349 浏览
提问于 2025-04-16 02:59

我在用Python写打印语句。我是这样执行我的脚本的:

python script.py > out.log nohup &

但是打印的内容并不是全部都显示在 out.log 文件里,虽然程序运行结束得还不错。

这行代码是在一个 .sh 文件里,我是通过执行 ./script.sh 来运行的。

更新: 日志确实收到了所有的数据,但只有在打印了特定数量的行之后才会显示出来。看起来是输出被缓冲了。

2 个回答

1

你试过以下方法吗:

  1. 先不使用重定向,确保所有输出都正常显示
  2. 直接在命令行中运行,而不是通过脚本来运行

?

这些步骤可能会帮助你更好地找到问题所在。

27

当标准输出(stdout)发送到终端(tty)时,它会按行进行缓冲,也就是说每输出一行就会立即显示。但如果输出被重定向到文件或管道中,它就会进行完全缓冲,这样只有在缓冲区满了的时候,才会定期刷新输出。

如果你希望输出能够立即显示,就需要在每一行后面加上 sys.stdout.flush() 这个调用,或者完全关闭缓冲。想了解如何关闭缓冲,可以参考这个链接:禁用输出缓冲,这里有几种方法:

  1. 使用 -u 命令行选项
  2. sys.stdout 包装在一个每次写入后都会刷新输出的对象里
  3. 设置环境变量 PYTHONUNBUFFERED
  4. sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

撰写回答