tqdm trong Jupyter Notebook in liên tục các thanh tiến trình mới


138

Tôi đang sử dụng tqdmđể in tiến trình trong tập lệnh Tôi đang chạy trong sổ ghi chép Jupyter. Tôi đang in tất cả các tin nhắn đến bàn điều khiển thông qua tqdm.write(). Tuy nhiên, điều này vẫn mang lại cho tôi một đầu ra sai lệch như vậy:

nhập mô tả hình ảnh ở đây

Nghĩa là, mỗi lần in một dòng mới, một thanh tiến trình mới sẽ được in trên dòng tiếp theo. Điều này không xảy ra khi tôi chạy tập lệnh qua thiết bị đầu cuối. Làm sao tôi có thể giải quyết việc này?


Trên thực tế, khi tôi sử dụng tqdm_notebook, tôi thậm chí có thể thực hiện prints bình thường và nó không ảnh hưởng đến thanh tiến trình.
Tomasz Gandor

một cách khác là sử dụng progressbar stackoverflow.com/questions/3160699/python-proTHER-bar/iêu
eusoubrasileiro

Câu trả lời:


216

Hãy thử sử dụng tqdm.notebook.tqdmthay vì tqdm, như được nêu ở đây .

Điều này có thể đơn giản như thay đổi nhập khẩu của bạn thành:

from tqdm.notebook import tqdm

Chúc may mắn!

EDIT: Sau khi thử nghiệm, có vẻ như tqdmthực sự hoạt động tốt ở 'chế độ văn bản' trong sổ ghi chép Jupyter. Thật khó để nói vì bạn chưa cung cấp một ví dụ tối thiểu , nhưng có vẻ như vấn đề của bạn là do câu lệnh in trong mỗi lần lặp. Câu lệnh in đang đưa một số (~ 0,89) vào giữa mỗi lần cập nhật thanh trạng thái, điều này làm rối tung đầu ra. Hãy thử xóa câu lệnh in.


2
Tôi đã không sử dụng một print()tuyên bố, tôi đã sử dụng tqdm.write(). Tuy nhiên, tqdm_notebookcho kết quả tốt. Cảm ơn :)
Rohan Saxena

Bạn có biết nếu nó hỗ trợ Python 3.6? Tôi đã không gặp may mắn với điều này
Jon

1
lỗi gì bạn nhận được? Việc này ổn với tôi. Không thể giúp với rất ít thông tin ... Bạn đã kích hoạt ipywidgets trong jupyer chưa? Có phải bạn chỉ đơn giản tqdm, hơn là tqdm_notebook? Điều này hoạt động tốt với Python 3.6 và Jupyter 1.0.0.
oscarbranson

tqdm_notebook từ tqdm 4.19.4 đang hoạt động với tôi trên Python 3.6, máy tính xách tay Jupyter 5.0.0 và ipywidgets 7.0.3.
Matt Kleinsmith

2
@ bugmenot123 Bắt tốt, cố định.
Czyzby

39

Đâ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ẩnthiế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 đó).


một cách khác là sử dụng progressbar stackoverflow.com/a
432482761/1207193

Đây là câu trả lời tốt nhất cho đến nay.
Rafay

18

Hầu hết các câu trả lời đã lỗi thời. Tốt hơn nếu bạn nhập tqdm chính xác.

from tqdm import tqdm_notebook as tqdm

nhập mô tả hình ảnh ở đây


7
Nó đã thay đổi một lần nữa:TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
stason

10

Nếu các mẹo khác ở đây không hoạt động và - giống như tôi - bạn đang sử dụng pandastích hợp thông qua progress_apply, bạn có thể tqdmxử lý nó:

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

Điểm chính ở đây nằm ở tqdm.autonotebookmô-đun. Như đã nêu trong hướng dẫn sử dụng trong IPython Notebook , điều này giúp tqdmlựa chọn giữa các định dạng thanh tiến trình được sử dụng trong sổ ghi chép Jupyter và bảng điều khiển Jupyter - vì một lý do vẫn thiếu điều tra thêm về phía tôi, định dạng cụ thể được chọn bởi tqdm.autonotebookhoạt động trơn tru pandas, trong khi tất cả các định dạng khác được chọn 't, progress_applycụ thể.


9

Để hoàn thành câu trả lời của oscarbranson: có thể tự động chọn phiên bản bàn điều khiển hoặc máy tính xách tay của thanh tiến trình tùy thuộc vào nơi nó được chạy từ:

from tqdm.autonotebook import tqdm

Thông tin thêm có thể được tìm thấy ở đây


8

Không có cái nào ở trên làm việc cho tôi. Tôi thấy rằng việc chạy theo sau sắp xếp vấn đề này sau lỗi (Nó chỉ xóa tất cả các trường hợp của thanh tiến trình trong nền):

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

1
Cảm ơn bạn! Tuy nhiên, nó ném và lỗi nếu không có trường hợp tồn tại. Vẫn muốn sử dụng nó với các kịch bản và Hydrogen IDE. Đây là mã của tôi. try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
Jacques Peeters

Yup nó sẽ ném một ngoại lệ nếu không có trường hợp nào tồn tại. Có một vấn đề với cố gắng của bạn ngoại trừ cách tiếp cận?
James Owers

0

Sử dụng tqdm_notebook

từ tqdm nhập tqdm_notebook dưới dạng tqdm

x = [1,2,3,4,5]

cho tôi trong tqdm (len (x)):

print(x[i])

0

Đối với tất cả những người đang ở trên windows và không thể giải quyết vấn đề trùng lặp với bất kỳ giải pháp nào được đề cập ở đây. Tôi đã phải cài đặt coloramagói như đã nêu trong các vấn đề đã biết của tqdm đã sửa nó.

pip install colorama

Hãy thử nó với ví dụ này:

from tqdm import tqdm
from time import sleep

for _ in tqdm(range(5), "All", ncols = 80, position = 0):
    for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
        sleep(0.01)

Mà sẽ tạo ra một cái gì đó như:

All:  60%|████████████████████████                | 3/5 [00:03<00:02,  1.02s/it]
Sub:  50%|██████████████████▌                  | 50/100 [00:00<00:00, 97.88it/s]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.