带有 Docker 日志的 tqdm 进度条

Mik*_*maa 4 python docker tqdm

我正在使用tqdm显示 Python 控制台应用程序的各种进度条。对于应用程序的生产部署,我使用 Docker。

在终端中运行 Python 应用程序时,进度条工作正常。但是,当 Dockerized 并通过进度条访问终端输出时,docker logs它不起作用,因为据我了解,它不是交互式终端。虽然看起来如果docker logs在进度条完成后转储,则进度会被渲染,但不确定是否有其他条件会发生这种情况(输出缓冲?)。

我想改变我的tqdm行为,以便

  • 它检测何时在非交互式 Docker 化环境中运行
  • 它将定期记录完成语句(完成 10%,X 次迭代/秒),而不是显示交互式进度条

这样,在生产中运行应用程序时,可以更容易地访问进度持续时间等。

将这样的自定义行为附加到的方法是什么tqdm

Sla*_*sky 5

您可以根据是否存在 TERM 环境变量来识别您的进程是否在非交互式 docker 环境中运行。

# interactive environment
$ docker run --rm -it centos:7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=8c810e490671
TERM=xterm
HOME=/root

# non-interactive environment
$ docker run --rm  centos:7 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=e267f2ba0f8f
HOME=/root
Run Code Online (Sandbox Code Playgroud)

在您的脚本中考虑这一事实,并且在非交互式环境的情况下使用totaltqdm 或其参数disable

总计:int 或 float,可选

预期的迭代次数。如果未指定,则尽可能使用 len(iterable)。如果 float("inf") 或作为最后的手段,则仅显示基本进度统计信息(无预计到达时间,无进度条)。如果 gui 为 True 并且该参数需要后续更新,请指定一个初始任意大正数,例如 9e9。

禁用:布尔值,可选

是否禁用整个进度条包装器[默认值:False]。如果设置为“无”,则在非 TTY 上禁用。

https://github.com/tqdm/tqdm/#parameters

更新:

看起来非交互式环境中的 TERM env 变量的值为“dumb”

docker run --rm  centos:7 bash -c 'echo "${TERM}"'
dumb
Run Code Online (Sandbox Code Playgroud)