0

我在 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 

UPDATE2:sys.stdout.flush()在打印循环中添加一个:

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

仅适用于打印,但不适用于 tqdm 进度。sys.stderr.flush()还添加了注释,但没有成功。

UPDATE3:目前一个临时解决方案是:

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]

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

4

0 回答 0