Đây là một câu trả lời thay thế cho trường hợp tqdm_notebook không phù hợp với bạn.
Cho ví dụ sau:
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values)) as pbar:
for i in values:
pbar.write('processed: %d' %i)
pbar.update(1)
sleep(1)
Đầu ra sẽ trông giống như thế này (tiến trình sẽ hiển thị màu đỏ):
0%| | 0/3 [00:00<?, ?it/s]
processed: 1
67%|██████▋ | 2/3 [00:01<00:00, 1.99it/s]
processed: 2
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
processed: 3
Vấn đề là đầu ra cho thiết bị xuất chuẩn và thiết bị xuất chuẩn được xử lý không đồng bộ và riêng biệt theo các dòng mới.
Nếu nói Jupyter nhận được trên stderr dòng đầu tiên và sau đó đầu ra "được xử lý" trên thiết bị xuất chuẩn. Sau đó, một khi nó nhận được một đầu ra trên thiết bị lỗi chuẩn để cập nhật tiến trình, nó sẽ không quay lại và cập nhật dòng đầu tiên vì nó sẽ chỉ cập nhật dòng cuối cùng. Thay vào đó, nó sẽ phải viết một dòng mới.
Cách giải quyết 1, viết vào thiết bị xuất chuẩn
Thay vào đó, một cách giải quyết khác là xuất cả hai ra thiết bị xuất chuẩn:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Đầu ra sẽ thay đổi thành (không còn màu đỏ):
processed: 1 | 0/3 [00:00<?, ?it/s]
processed: 2 | 0/3 [00:00<?, ?it/s]
processed: 3 | 2/3 [00:01<00:00, 1.99it/s]
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Ở đây chúng ta có thể thấy rằng Jupyter dường như không rõ ràng cho đến cuối dòng. Chúng ta có thể thêm một cách giải quyết khác bằng cách thêm khoảng trắng. Nhu la:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
pbar.update(1)
sleep(1)
Cung cấp cho chúng tôi:
processed: 1
processed: 2
processed: 3
100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Giải pháp thay thế 2, đặt mô tả thay thế
Nói chung, có thể nói thẳng hơn là không có hai đầu ra mà thay vào đó là cập nhật mô tả, ví dụ:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.set_description('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Với đầu ra (mô tả được cập nhật trong khi nó đang xử lý):
processed: 3: 100%|██████████| 3/3 [00:02<00:00, 1.53it/s]
Phần kết luận
Bạn chủ yếu có thể làm cho nó hoạt động tốt với tqdm đơn giản. Nhưng nếu tqdm_notebook hoạt động cho bạn, chỉ cần sử dụng nó (nhưng có lẽ bạn sẽ không đọc được đến đó).
tqdm_notebook
, tôi thậm chí có thể thực hiệnprint
s bình thường và nó không ảnh hưởng đến thanh tiến trình.