微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 kubernetes 作业中查看 pod 的标准输出

如何解决如何在 kubernetes 作业中查看 pod 的标准输出

我在 Kubernetes 有一份工作,有一个 python 脚本,该脚本将 tqdm 进度条打印到 stdout(或 stderr?)。但是,无法看到进度条:

kubectl logs test-qpgb7 # returns nothing 
kubectl logs -f test-qpgb7 # hangs and returns nothing also
apiVersion: batch/v1
kind: Job
Metadata:
  name: test
  labels:
    job: test
spec:
  template:
    spec:
      containers:
        - name: test
          image: my-image
          imagePullPolicy: IfNotPresent
          command: ["python","test.py"]
      restartPolicy: Never
  backoffLimit: 1 
# test.py
import tqdm
from time import sleep

if __name__ == "__main__":
    for i in tqdm.tqdm(range(0,1000)):
        sleep(2)

是否可以在作业尚未完成时查看进度条状态?作业完成时 kubectl logs test-qpgb7 确实有效。

更新: 问题似乎不在 tqdm 中,因为这也不显示输出

# test.py
# import tqdm
from time import sleep

if __name__ == "__main__":
    for i in range(0,1000):
        print(str(i))
        sleep(2)
FROM python:3.9.1 

workdir /integrity 

copY requirements.txt . 

copY src/ . 

RUN pip install -r requirements.txt 

更新2: 在打印循环中添加 sys.stdout.flush()

if __name__ == "__main__":
    for i in range(0,1000):
        print(str(i))
        sys.stdout.flush()
        sleep(2)

仅对打印有效,对 tqdm 进度无效。注意 sys.stderr.flush() 也被添加,但没有成功。

更新3: 目前一个临时解决方案是:

from tqdm import tqdm
from time import sleep
import sys

if __name__ == "__main__":
    for i in tqdm(range(0,1000),file=sys.stdout):
        print("")
        sys.stdout.flush()
        sys.stderr.flush()
        sleep(2)
# kubectl logs -f  test007-ctqjh
  0%|          | 0/1000 [00:00<?,?it/s]
  0%|          | 1/1000 [00:02<33:20,2.00s/it]
  0%|          | 2/1000 [00:04<33:18,2.00s/it]
  0%|          | 3/1000 [00:06<33:16,2.00s/it]
  0%|          | 4/1000 [00:08<33:14,2.00s/it]
  0%|          | 5/1000 [00:10<33:12,2.00s/it]
  1%|          | 6/1000 [00:12<33:10,2.00s/it]

每次都打印在新行上。但是,如果有人找到如何在不打印到新行的情况下完成这项工作,将会很感兴趣。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?