Jupyter Notebook의 tqdm이 새로운 진행률 표시 줄을 반복적으로 인쇄합니다


138

tqdmJupyter 노트북에서 실행중인 스크립트에서 진행 상황을 인쇄 하는 데 사용 하고 있습니다. 를 통해 모든 메시지를 콘솔에 인쇄하고 tqdm.write()있습니다. 그러나 이것은 여전히 ​​나에게 다음과 같이 왜곡 된 결과를줍니다.

여기에 이미지 설명을 입력하십시오

즉, 새 줄을 인쇄해야 할 때마다 다음 줄에 새 진행률 표시 줄이 인쇄됩니다. 터미널을 통해 스크립트를 실행할 때 발생하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?


실제로을 사용할 때 tqdm_notebook일반조차 수행 할 수 print있으며 진행률 표시 줄에 영향을 미치지 않습니다.
Tomasz Gandor

대안이 사용하는 것입니다 progressbar stackoverflow.com/questions/3160699/python-progress-bar/...
eusoubrasileiro

답변:


216

여기에 요약 된대로 tqdm.notebook.tqdm대신 사용 하십시오 .tqdm

가져 오기를 다음과 같이 변경하는 것만 큼 간단 할 수 있습니다.

from tqdm.notebook import tqdm

행운을 빕니다!

편집 : 테스트 후 tqdmJupyter 노트북의 '텍스트 모드'에서 실제로 제대로 작동 하는 것 같습니다 . 최소한의 예제를 제공하지 않았기 때문에 말하기가 어렵지만 문제가 각 반복의 인쇄 문으로 인해 발생한 것처럼 보입니다. print 문은 각 상태 표시 줄 업데이트 사이에 숫자 (~ 0.89)를 출력하여 출력을 엉망으로 만듭니다. 인쇄 문을 제거해보십시오.


2
나는 print()성명서를 사용하지 않았다 tqdm.write(). 그러나 tqdm_notebook좋은 결과를 제공합니다. 감사합니다
:)

파이썬 3.6을 지원하는지 알고 있습니까? 나는 이것으로 운이 없었어요
Jon

1
어떤 오류가 발생합니까? 그것은 나를 위해 잘 작동합니다. 작은 정보로 도울 수 없습니다 ... jupyer에서 ipywidgets활성화하셨습니까 ? 당신은 tqdm오히려 평범한가 tqdm_notebook? 이것은 Python 3.6 및 Jupyter 1.0.0에서 잘 작동합니다.
oscarbranson '10

tqdm 4.19.4의 tqdm_notebook은 Python 3.6, Jupyter notebook 5.0.0 및 ipywidgets 7.0.3에서 작동합니다.
매트 클라인 스미스

2
@ bugmenot123 잘 잡았습니다.
Czyzby

39

이것은 tqdm_notebook 이 작동하지 않는 경우에 대한 대체 답변입니다 .

다음과 같은 예가 주어진다 :

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)

결과는 다음과 같습니다 (진행률이 빨간색으로 표시됨).

  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

문제는 stdoutstderr에 대한 출력입니다. 이 새 행의 관점에서 비동기식으로 개별적으로 처리 입니다.

Jupyter가 stderr에서 첫 번째 라인을 수신 한 다음 stdout에서 "processed"출력을 수신한다고 가정하십시오. 그런 다음 stderr에서 출력을 수신하여 진행 상황을 업데이트하면 마지막 줄만 업데이트하므로 돌아 가지 않고 첫 번째 줄을 업데이트합니다. 대신 새 줄을 작성해야합니다.

해결 방법 1, stdout에 쓰기

한 가지 해결 방법은 둘 다 stdout으로 출력하는 것입니다.

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)

출력이 (더 이상 빨간색으로) 변경됩니다 :

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]

여기서 Jupyter가 줄이 끝날 때까지 명확하지 않은 것으로 보입니다. 공백을 추가하여 다른 해결 방법을 추가 할 수 있습니다. 같은 :

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)

우리에게주는 것 :

processed: 1                                                  
processed: 2                                                  
processed: 3                                                  
100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

해결 방법 2, 대신 설명 설정

일반적으로 두 개의 출력을 가지지 않고 대신 설명을 업데이트하는 것이 더 간단 할 수 있습니다. 예 :

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)

출력으로 (처리 중 설명이 업데이트 됨) :

processed: 3: 100%|██████████| 3/3 [00:02<00:00,  1.53it/s]

결론

대부분 일반 tqdm으로 잘 작동하도록 할 수 있습니다. 그러나 tqdm_notebook이 효과가 있다면 그냥 사용하십시오 (그러나 아마도 그 정도는 읽지 못할 것입니다).


대안이 사용하는 것입니다 progressbar stackoverflow.com/a/34482761/1207193
eusoubrasileiro

이것이 가장 좋은 답변입니다.
Rafay

18

대부분의 답변은 구식입니다. tqdm을 올바르게 가져 오면좋습니다 .

from tqdm import tqdm_notebook as tqdm

여기에 이미지 설명을 입력하십시오


7
다시 변경 :TqdmDeprecationWarning: This function will be removed in tqdm==5.0.0 Please use tqdm.notebook.tqdm instead of tqdm.tqdm_notebook
stason

10

여기의 다른 팁이 작동하지 않고 나처럼 pandas통합을 사용하는 경우 처리 progress_apply할 수 tqdm있습니다.

from tqdm.autonotebook import tqdm
tqdm.pandas()

df.progress_apply(row_function, axis=1)

여기서 핵심은 tqdm.autonotebook모듈에 있습니다. 에 명시된 바와 같이 IPython 노트북에서 사용하기에 감독의 지시 ,이 차종은 tqdmJupyter 노트북에 사용되는 진행률 표시 줄 형식과 Jupyter 콘솔 사이에서 선택 - 이유는 여전히 내 옆에 더 조사를 부족에 대한가 선택한 특정 형식 tqdm.autonotebook원활하게 작동 pandas다른 모든 didn를하면서, 아니, progress_apply구체적으로.


9

oscarbranson의 답변을 완료하려면 : 실행 위치에 따라 진행률 표시 줄의 콘솔 또는 노트북 버전을 자동으로 선택할 수 있습니다.

from tqdm.autonotebook import tqdm

더 많은 정보는 여기 에서 찾을 수 있습니다


8

위의 어느 것도 나를 위해 작동하지 않습니다. 다음을 실행하면 오류 후에이 문제가 정렬됩니다 (백그라운드에서 진행률 표시 줄의 모든 인스턴스를 지 웁니다).

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

1
감사합니다! 그러나 인스턴스가 없으면 오류가 발생하고 오류가 발생합니다. 여전히 스크립트 및 수소 IDE와 함께 사용하고 싶습니다. 여기 내 코드가 있습니다. try: # Avoids problem on notebooks / Hydrogen IDE tqdm.tqdm._instances.clear() except Exception: pass
Jacques Peeters

예, 인스턴스가 없으면 예외가 발생합니다. 접근 방식을 제외하고 시도에 문제가 있습니까?
James Owers


0

창문에 있고 여기에 언급 된 솔루션 중 하나에서 중복 막대 문제를 해결할 수없는 모든 사람들에게. tqdm의 알려진 문제colorama 에서 설명한 대로 패키지 를 설치해야 했습니다.

pip install colorama

이 예제로 시도하십시오.

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)

다음과 같은 것을 생성합니다.

All:  60%|████████████████████████                | 3/5 [00:03<00:02,  1.02s/it]
Sub:  50%|██████████████████▌                  | 50/100 [00:00<00:00, 97.88it/s]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.