Python sys.stderr刷新频率

8
sys.stderr缓冲区刷新的频率是多少,这在不同的环境中是否是标准的?
>>> import sys
>>> sys.__stderr__
<open file '<stderr>', mode 'w' at 0x2b4fcb7ac270>

我发现这只是一种标准文件类型,但我不知道它应该具有什么缓冲区值。 dir() 似乎也没有提供任何有用的信息。


1
stderr,独立于sys.stderr,通常为无缓冲状态。 - Ignacio Vazquez-Abrams
刚刚遇到一个使用情况,其中stderr被缓冲并导致问题:docker run -d -p 8000:8000 ubuntu python3 -m http.server 运行一个Python HTTP服务器守护程序。所有输出都在stderr中,如果没有给出答案中的-u标志,Python将不会将其刷新到docker logs - Air
1个回答

5
更新:自 Python 3.9 开始,默认情况下 sys.stderr 是行缓冲的。如果给 python 命令传入 -u 选项或设置了 $PYTHONUNBUFFERED 环境变量,则强制 stdout 和 stderr 流是无缓冲的(包括文本层,自 Python 3.7 起)。

旧回答:

在 Python 2 中,我找不到文档中指定 sys.stderr 缓冲区的位置。我期望与 C 中的 stderr 不经过缓冲一样 (除了 Windows),但我不知道 c99 标准是否要求这样。在 POSIX 中,标准错误流不是完全缓冲的。在 Python 2 中,-u 选项强制使标准流无缓冲

在 Python 3 中

交互式操作时,标准流是行缓冲的。否则,它们与常规文本文件一样是块缓冲的。您可以使用 -u 命令行选项覆盖此值。

-u 命令行选项

强制使 stdout 和 stderr 流(可通过其 buffer 属性访问的二进制层)无缓冲。如果写入控制台,则文本 I/O 层仍然是行缓冲的,如果重定向到非交互式文件,则为块缓冲。


重要更改: 从3.7版本开始,stdout和stderr流的文本层现在是无缓冲的。 - user582175

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接