【问题标题】:Python sys.stderr flush frequencyPython sys.stderr 刷新频率
【发布时间】:2014-04-23 15:23:45
【问题描述】:

sys.stderr 多久刷新一次缓冲区,不同环境之间是否有此标准?

>>> import sys
>>> sys.__stderr__
<open file '<stderr>', mode 'w' at 0x2b4fcb7ac270>

我看到它只是一个标准文件类型,但我不知道buffering 应该是什么值。 dir() 似乎也没有提供任何有用的信息。

【问题讨论】:

  • stderr,独立于sys.stderr,通常是无缓冲的。
  • 刚刚遇到一个 stderr 被缓冲并导致问题的用例:docker run -d -p 8000:8000 ubuntu python3 -m http.server 运行 python HTTP 服务器守护程序。所有输出都到 stderr,如果没有答案中给出的 -u 标志,python 不会将其刷新到 docker logs

标签: python buffer flush stderr


【解决方案1】:

更新sys.stderr 自 Python 3.9 起默认为行缓冲。如果python 接收到-u 命令行选项或设置了$PYTHONUNBUFFERED 环境变量,则stdout 和stderr 流将被强制无缓冲(包括Python 3.7 以来的文本层)。


旧答案:

在 Python 2 上,我找不到在文档中指定 sys.stderr 的缓冲的位置。我希望与stderr in C that is unbuffered(except Windows) 具有相同的行为,但我不知道 c99 标准是否要求这样做。 The standard error stream is not fully buffered 在 POSIX 中。 -u option forces standard streams to be unbuffered 在 Python 2 中。

On Python 3:

交互时,标准流是行缓冲的。否则,他们 像常规文本文件一样被块缓冲。你可以覆盖这个 带有-u 命令行选项的值。

-u command-line option:

强制 stdout 和 stderr 流的二进制层(即 可作为他们的buffer 属性)被无缓冲。文本 I/O 如果写入控制台,图层仍将被行缓冲,或者 如果重定向到非交互式文件,则为块缓冲。

【讨论】:

  • 重要更改:3.7 版更改:stdout 和 stderr 流的文本层现在没有缓冲。
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 2020-11-17
  • 1970-01-01
  • 2022-07-13
  • 2011-09-18
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多