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

标签 python docker docker-compose

在由 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/

相关文章:

python - 使用 docker-compose up 运行时如何优雅地停止 Dockerized Python ROS2 节点?

nginx - Docker - index.html Nginx 文件共享无效

python - socketserver - 允许重用地址重新绑定(bind)现有端口号在不覆盖类变量的情况下不起作用

mysql - Redis 连接到 my-redis :6379 failed - getaddrinfo ENOTFOUND when running seeds

php - 警告:require_once(/var/www/html/wp-config.php):无法打开流:没有这样的文件或目录

docker - 如何找到Docker镜像的构建时间?

python - 使用 zipfile python 更改文件名

python - 将大型 JSON 文件一次拆分为 100 个批处理,以便通过 API 运行

python - Django form.is_valid 不断抛出 KeyError

docker - 如何在构建时在 docker-compose 中指定 $docker build --network ="host"模式