【问题标题】:Progress Bar not updating in Python container on KubernetesKubernetes 上的 Python 容器中的进度条未更新
【发布时间】:2019-03-08 21:20:03
【问题描述】:

我正在尝试在 Kubernetes 上的 Python 容器中创建一个简单的进度条。但是,在工作完成并且进度条达到 100% 之前,它不会输出任何内容。完全相同的代码在本地 Docker 容器中完美运行。那么 Kubernetes 有什么地方会阻止我在其日志中看到实时更新的进度条呢?

进度条码:

import sys
import time


class Color:
    BOLD = '\033[1m'
    ENDC = '\033[0m'


ERASE_LINE = '\x1b[2K\r'


def percentage(current, total):
    percent = 100 * float(current) / float(total)
    return percent


class ProgressBar:

    def __init__(self, total):
        self._total = total
        self._current = 0
        self.print()

    def update(self):
        self._current += 1
        self.print()

    def print(self):
        percent = percentage(self._current, self._total)
        sys.stdout.write("\r")
        sys.stdout.write(Color.BOLD + "[%-50s] %d%%" % ('=' * int(percent / 2), percent) + Color.ENDC)
        sys.stdout.flush()


if __name__=="__main__":
    print("Ready to run soon...")
    time.sleep(10)
    print("Running!")
    pbar = ProgressBar(255)
    for i in range(255):
        time.sleep(0.03)
        pbar.update()

【问题讨论】:

  • 您从哪里观察输出,本地/远程终端会话?是本地 minikube 吗?
  • 通过远程终端会话。我通过 SSH 进入 k8s 集群,然后在 pod 上运行 logs -f
  • 啊,那会是个问题。日志拖尾将在打印一行之前等待\n - 据我所知,您的脚本正在一遍又一遍地重写同一行。我猜脚本或容器的终止会发送一个 EOF 或只是刷新缓冲区并添加一个 \n
  • 有道理,我没想到。感谢您的洞察力。您对我如何解决这个问题有什么想法吗?

标签: python docker logging kubernetes


【解决方案1】:

登录时,您通常需要登录以\n 结尾的完整行,而不是在 TTY 中向人显示内容。我通常会推荐打印出10%...\n20%...\n etc 之类的东西,而不是进度条。由您决定多久打印一次当前状态。

更新:

您可以更新脚本以检测终端是否为 TTY,并相应地更改行为

使用这个:

import os, sys
if os.isatty(sys.stdout.fileno()):

【讨论】:

  • +1,我在这个回复中添加了一些信息。您可以使用os.isatty(sys.stdout.fileno()) 来检测 stdout 是否为 TTY 终端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 2016-08-09
  • 2022-08-15
相关资源
最近更新 更多