使用Docker日志的tqdm进度条

4
我正在使用 tqdm 在 Python 控制台应用程序中显示各种进度条。对于应用程序的生产部署,我使用 Docker。
当在终端上运行 Python 应用程序时,进度条正常工作。然而,当 Docker 化并通过 docker logs 访问终端输出时,进度条不起作用,因为据我所知它不是交互式终端。尽管看起来进度条完成后会呈现进度,但不确定是否有其他条件(如输出缓冲)。
我想修改我的 tqdm 行为,使其:
  • 检测是否在非交互式 Docker 环境中运行
  • 不显示交互式进度条,而是定期记录完成语句(10% 完成,X 次/秒)
这样,在生产环境中运行应用程序时,进度持续时间等信息将更易于访问。
如何将此自定义行为附加到 tqdm 中?

我不确定你是否会将那个行为附加到tqdm本身;我认为你应该修改你的代码,这样如果它在终端上运行,就使用tqdm,如果它不在终端上运行,你只需记录普通文本消息。 - larsks
tqdm已经通过auto导入为Jupyter笔记本提供了特殊的行为。我不认为这会有什么不同。 - Mikko Ohtamaa
1个回答

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

考虑到这个事实,在非交互式环境中,请使用tqdm的total参数或将其disable

total:int或float,可选项

预期迭代次数。如果未指定,则尽可能使用len(iterable)。如果float(“ inf”)或作为最后的资源,仅显示基本进度统计信息(没有ETA,没有进度条)。如果gui为True并且此参数需要后续更新,请指定一个初始的任意大正数,例如9e9。

disable:bool,可选项

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

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

更新:

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

docker run --rm  centos:7 bash -c 'echo "${TERM}"'
dumb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接