gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:43:43 25 4
gpt4 key购买 nike

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

print("Hello? Anyone there?")

...永远不会出现在常规日志中:

enter image description here

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

如何避免我的 print() 调用被忽略?

最佳答案

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

有几个选项:

1.调用显式 flush

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

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

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

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

import sys
sys.stdout.flush()

如果您想要最大程度地控制何时刷新将发生,则此选项很有用。

<强>2。通过 PYTHONUNBUFFERED 取消缓冲整个应用程序环境变量

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

PYTHONUNBUFFERED: 1

这将导致所有输出到 stdout立即冲洗。

3.使用 -u 运行 python

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

关于python - docker-compose 不在 Python 应用程序中打印标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51362213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com