在由 Docker Compose 管理的 Docker 容器内运行的 Python 应用程序中使用 print()
语句时,仅记录 sys.stderr
输出。 Vanilla print()
没有看到语句,所以这个:
print("Hello? Anyone there?")
…从不出现在常规日志中:
(您可以在我的应用程序中看到其他库明确打印的其他日志,但看不到我自己的调用。)
如何避免我的 print()
呼叫被忽略?
原文由 Lee Benson 发布,翻译遵循 CC BY-SA 4.0 许可协议
默认情况下,Python 将输出缓冲到
sys.stdout
。有几个选项:
1.调用显式
flush
重构原始打印语句以包含
flush=True
关键字,例如:注意:这将导致 整个 缓冲区刷新,而不仅仅是同一个打印调用。因此,如果其他地方有“裸”打印函数调用(即没有
flush=True
)未明确取消缓冲,则这些函数也将始终被刷新。您可以通过以下方式实现相同的目的:
如果您希望最大程度地控制刷新 发生 的时间,则此选项很有用。
2. 通过
PYTHONUNBUFFERED
env var 取消缓冲整个应用程序将以下内容放入
docker-compose.yml
文件的environment
部分:PYTHONUNBUFFERED: 1
这将导致
stdout
的所有输出立即被刷新。3. 运行 python
-u
与上面的选项 #2 一样,这将导致 Python 在应用程序的整个执行生命周期内“无缓冲”地运行。只需运行
python -u <entrypoint.py>
- 不需要环境变量。