docker-compose 不在 Python 应用程序中打印标准输出

新手上路,请多包涵

在由 Docker Compose 管理的 Docker 容器内运行的 Python 应用程序中使用 print() 语句时,仅记录 sys.stderr 输出。 Vanilla print() 没有看到语句,所以这个:

 print("Hello? Anyone there?")

…从不出现在常规日志中:

在此处输入图像描述

(您可以在我的应用程序中看到其他库明确打印的其他日志,但看不到我自己的调用。)

如何避免我的 print() 呼叫被忽略?

原文由 Lee Benson 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
1 个回答

默认情况下,Python 将输出缓冲到 sys.stdout

有几个选项:

1.调用显式 flush

重构原始打印语句以包含 flush=True 关键字,例如:

 print("Hello? Anyone there?", flush=True)

注意:这将导致 整个 缓冲区刷新,而不仅仅是同一个打印调用。因此,如果其他地方有“裸”打印函数调用(即没有 flush=True )未明确取消缓冲,则这些函数也将始终被刷新。

您可以通过以下方式实现相同的目的:

 import sys
sys.stdout.flush()

如果您希望最大程度地控制刷新 发生 的时间,则此选项很有用。

2. 通过 PYTHONUNBUFFERED env var 取消缓冲整个应用程序

将以下内容放入 docker-compose.yml 文件的 environment 部分:

PYTHONUNBUFFERED: 1

这将导致 stdout 的所有输出立即被刷新。

3. 运行 python -u

与上面的选项 #2 一样,这将导致 Python 在应用程序的整个执行生命周期内“无缓冲”地运行。只需运行 python -u <entrypoint.py> - 不需要环境变量。

原文由 Lee Benson 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题