在由 Docker Compose 管理的 Docker 容器内运行的 Python 应用程序中使用 print()
语句时,仅记录 sys.stderr
输出。没有看到原版 print()
语句,因此:
print("Hello? Anyone there?")
...永远不会出现在常规日志中:
(您可以在我的应用程序中看到其他库显式打印的其他日志,但没有我自己的调用。)
如何避免我的 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/