programing

Jupyter 노트북의 tqdm은 새로운 진행 표시줄을 반복적으로 인쇄합니다.

bestcode 2023. 1. 21. 09:48
반응형

Jupyter 노트북의 tqdm은 새로운 진행 표시줄을 반복적으로 인쇄합니다.

하고 .tqdm진행 상황을 인쇄하기 위해 주피터 노트북에서 실행 중입니다.합니다.tqdm.write()은 여전히 만만 、 음음 、 음음 、 음 . 、 음 . . . 。

여기에 이미지 설명 입력

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

도 한번 써보세요.tqdm.notebook.tqdmtqdm, 여기에 개략적으로 기재되어 있습니다.

Import를 다음과 같이 변경하기만 하면 됩니다.

from tqdm.notebook import tqdm

행운을 빕니다.

EDIT: 테스트 결과tqdm실제로 주피터 노트북의 '텍스트 모드'에서는 정상적으로 동작합니다.최소한의 예를 제시하지 않았기 때문에 알기 어렵지만, 반복할 때마다 인쇄문이 원인이 되어 문제가 발생하고 있는 것 같습니다.인쇄문이 각 상태 표시줄 업데이트 사이에 숫자(~0.89)를 출력하고 있어 출력이 흐트러집니다.인쇄문을 삭제해 보세요.

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에서 "처리된" 출력을 수신한 경우.그런 다음 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]

여기서 우리는 주피터가 마지막까지 명확해 보이지 않는 것을 알 수 있다.스페이스를 추가하여 다른 회피책을 추가할 수 있습니다.예를 들어 다음과 같습니다.

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이 도움이 된다면 그것을 사용해 주십시오(하지만 그렇게 멀리까지 읽지는 않을 것입니다).

지금은 대부분의 답이 구식이다.tqdm을 올바르게 Import 하는 것이 좋습니다.

from tqdm import tqdm_notebook as tqdm

여기에 이미지 설명 입력

oscarbranson의 답변을 완성하려면: 실행처에 따라 콘솔 또는 노트북의 프로그레스 바를 자동으로 선택할 수 있습니다.

from tqdm.autonotebook import tqdm

자세한 내용은 이쪽

여기 있는 다른 팁이 효과가 없다면, 그리고 나처럼,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다른 사람들은 그렇지 않았지만,progress_apply구체적으로는요.

위의 어느 것도 나에게는 통하지 않는다.다음 명령을 실행하면 오류 발생 후 이 문제가 정렬됩니다(백그라운드에 있는 진행 표시줄의 모든 인스턴스가 지워집니다).

from tqdm import tqdm

# blah blah your code errored

tqdm._instances.clear()

윈도우에 접속하여 여기에 기재된 솔루션 중 어느 것도 중복 바의 문제를 해결할 수 없는 모든 사용자에게 적합합니다.를 인스톨 할 필요가 있었습니다.coloramatqdm의 기존 문제에서 설명한 바와 같이 패키지를 수정합니다.

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]

사용.Python 3.9.2그리고.tqdm==4.62.3:

from tqdm.notebook import tqdm

for item in tqdm(list_of_items):
    do_something(item)

tqdm_노트북 사용

from tqdm import tqdm_notebook as tqdm

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

for i in tqdm(range(0,len(x))):

    print(x[i])

tqdm을 사용한 프로그레스바의 다른 예

      from tqdm import tqdm
      my_list = list(range(100))
      with tqdm(total=len(my_list)) as pbar:
          for x in my_list:
             pbar.update(1)

제 경우 ipywidgets를 업데이트하면 일반 사용 시 추가 인쇄가 필요 없습니다.from tqdm import tqdm.

언급URL : https://stackoverflow.com/questions/42212810/tqdm-in-jupyter-notebook-prints-new-progress-bars-repeatedly

반응형