我在 docker 容器中更改了一个 python 文件,但它没有生效(打印不起作用)[重复]
原文标题 :I changed a python file in docker container but it’s not taking effect (print not working) [duplicate]
在由 Docker Compose 管理的 Docker 容器内运行的 Python 应用程序中使用print()
语句时,仅记录sys.stderr
输出。没有看到香草print()
语句,所以:
print("Hello? Anyone there?")
…永远不会出现在常规日志中:
(您可以在我的应用程序中看到由其他库显式打印的其他日志,但没有我自己的调用。)
如何避免我的print()
电话被忽略?
回复
我来回复-
Lee Benson 评论
默认情况下,Python 缓冲输出到
sys.stdout
。有几个选项:
1.调用显式
flush
重构原始打印语句以包含一个
flush=True
关键字,例如:print("Hello? Anyone there?", flush=True)
注意:这将导致整个缓冲区刷新,而不仅仅是同一个打印调用。因此,如果在其他地方有“裸”打印函数调用(即没有
flush=True
)没有明确取消缓冲,这些也将始终被刷新。您可以通过以下方式实现相同的目标:
import sys sys.stdout.flush()
如果您想最大程度地控制何时进行刷新,此选项很有用。
2.通过
PYTHONUNBUFFERED
env var取消缓冲整个应用程序将以下内容放入您的
docker-compose.yml
文件的environment
部分:PYTHONUNBUFFERED: 1
这将导致立即刷新所有输出 to
stdout
。3.用
-u
运行python与上面的选项 #2 一样,这将导致 Python 在应用程序的整个执行生命周期内“无缓冲”运行。只需运行
python -u <entrypoint.py>
-不需要环境变量。2年前 -
Ignacio Peletier 评论
很简单,如果您在 Dockerfile 的行中添加选项 -u,它将打印您的日志:
CMD ["python", "-u", "my_python_script.py"]
无需更改环境变量或更改程序的所有打印语句。
2年前 -
Andrea 评论
使用
pytest
,我的解决方案是添加-s
选项。例如,在我还需要打开详细模式的场景中,我不得不放
pytest -sv
。2年前