在由Docker Compose管理的Docker容器中运行的Python应用程序中使用print()
语句时,仅记录sys.stderr
的输出。没有显示香草print()
语句,因此:
print("Hello? Anyone there?")
...从不显示在常规日志中:
(您可以在我的应用中看到其他库显式打印的其他日志,但没有我自己的调用。)
如何避免我的print()
通话被忽略?
答案 0 :(得分:10)
默认情况下,Python将输出缓冲到sys.stdout
。
有几种选择:
1。呼叫明确的flush
重构原始打印语句,使其包含flush=True
关键字,例如:
print("Hello? Anyone there?", flush=True)
注意:这将导致刷新整个缓冲区,而不仅仅是同一打印调用。因此,如果在其他地方(即没有flush=True
的“裸”打印函数调用没有显式地未缓冲),这些调用也将始终被刷新。
您可以使用以下方法实现相同的目的:
import sys
sys.stdout.flush()
如果您希望最大程度地控制刷新的时间,此选项很有用。
2。通过PYTHONUNBUFFERED
env var
将以下内容拖放到environment
文件的docker-compose.yml
部分中:
PYTHONUNBUFFERED: 1
这将导致stdout
的所有输出立即被刷新。
3。使用-u
就像上面的选项#2一样,这将导致Python在应用的整个执行生命周期中以“无缓冲”方式运行。只需运行python -u <entrypoint.py>
-不需要环境变量。
答案 1 :(得分:5)
如果在Dockerfile的运行行中添加选项-u,它将打印您的日志:
CMD ['python', '-u', 'my_python_script.py']
答案 2 :(得分:0)
使用 pytest
,我的解决方案是添加 -s
选项。
例如,在我还需要启用详细模式的场景中,我不得不输入 pytest -sv
。