code

왜 tqdm 인쇄가 같은 라인을 업데이트하는 대신 새로운 라인으로 진행됩니까?

starcafe 2023. 9. 5. 20:40
반응형

왜 tqdm 인쇄가 같은 라인을 업데이트하는 대신 새로운 라인으로 진행됩니까?

저는 python에서 tqdm 모듈을 사용하여 진행 표시줄을 보여주는 작은 명령줄 게임을 하고 있습니다.진행을 방해하기 위해 msvcrt 모듈을 사용하여 사용자 입력을 듣습니다.일단 중단되면 사용자는 명령줄 프롬프트에 '재시작'을 입력하여 다시 시작할 수 있습니다.진행률 표시줄이 두 번째로 표시되면 진행률과 동일한 줄을 업데이트하는 대신 매번 새 줄이 만들어집니다.

어떻게 하면 같은 라인에서 진행 상황을 보여줄 수 있습니까?

Progress bar issue

이 코드 조각은 진행률 표시줄을 사용하는 방법을 보여줍니다.

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                break

def interrupt():
    type("File transfer interrupted, to restart the transfer, type 'restart'")

사용해 보십시오.position=0그리고.leave=True

(새 줄로 인쇄하지 않기 위해 Google Colab에서 작동하는 솔루션)

from tqdm import tqdm 
import time

def foo_():
    time.sleep(0.3)
range_ = range(0, 10)
total = len(range_)

with tqdm(total=total, position=0, leave=True) as pbar:
   for i in tqdm((foo_, range_ ), position=0, leave=True):
    pbar.update()

tqdm_dll은 더 이상 사용되지 않습니다.tq.notebook을 사용해야 합니다.대신 tqdm.

import tqdm.notebook as tq
for i in tq.tqdm(...):

게다가 tqdm_notebook은 성능 면에서 정말 형편없었습니다.그것은 새 도서관에서 완전히 수정되었습니다.

tqdm을 다시 사용하기 전에 tqdm 인스턴스를 닫으면 Jupyter Lab의 새 줄에 상태 표시줄이 인쇄되는 문제가 해결된다는 것을 알았습니다.

while len(tqdm._instances) > 0:
    tqdm._instances.pop().close()

또는 더 좋은 것은, 제안에 대한 Nirmal의 감사입니다.

tqdm._instances.clear()

저는 이 문제에 많이 직면했고 가끔은position = 0&leave = True작동하지 않습니다.그래서 저는 다른 방법을 찾았습니다.

tqdm.tqdm 대신 tqdm.auto.tqdm을 사용할 수 있습니다.
또는
대신에

from tqdm import tqdm

사용해 보다

from tqdm.auto import tqdm
from tqdm import tqdm_notebook

이 명령은 Google collab에서 작동합니다.

사용해 보십시오.tqdm.tqdm.write표준을 대신하여print()

이렇게 하면 진행률 표시줄 위에 인쇄되고 진행률 표시줄이 한 줄 아래로 이동합니다.

저는 아래 코드를 사용하여 테스트했습니다.spacestdout으로 출력되지만 루프는 깨지지 않습니다.당신이 무엇을 성취하려고 하는지는 100% 명확하지 않았습니다.interrupt()의 함수는 제공된 문자열의 유형만 확인합니다.type() 내장 함수

import tqdm
import msvcrt
from time import sleep

def transfer():
    for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
        sleep(.1)
        if msvcrt.kbhit():
            if msvcrt.getwche() == ' ':
                interrupt()
                # break

def interrupt():
    tqdm.tqdm.write("File transfer interrupted, to restart the transfer, type 'restart'", end="")

transfer()

편집: 포함end의 매개 변수.tqdm.write()폴 네더우드 tqdm.tqdm.write()에 의해 언급된 바와 같이.

from tqdm import notebook

대신에tqdm(looping)
사용하다notebook.tqdm(looping)

tqdm을 두 번 가져올 수 있습니다.전체 노트북 커널을 다시 시작하고 다시 실행합니다.그것은 문제를 해결할 것입니다.또한 tqdm 내부의 모든 인쇄 문 때문에 표시될 수 있습니다.

사용 중에 이 문제가 발생하는 경우tqdm동료나 주피터 노트에...

의 노트북/콜라보 버전 사용tqdm

>>> from tqdm.notebook import trange, tqdm
>>> for i in trange(1000):
...     ...

다음은 구식이지만 tqdm을 재설정하는 데 상당히 잘 작동하는 것 같습니다.

from tqdm import tqdm as tqdm_base
def tqdm(*args, **kwargs):
    if hasattr(tqdm_base, '_instances'):
        for instance in list(tqdm_base._instances):
            tqdm_base._decr_instances(instance)
    return tqdm_base(*args, **kwargs)

때때로 이전 출력이 처음에 인쇄되지만(이를 제거하는 방법을 잘 모르겠습니다), 새 줄(특히 긴 루프)보다 훨씬 덜 귀찮습니다.

앞서 언급한 것 외에도position=0, leave=True 변수,내에는 매개변, 내경는에tqdm의이행ascii=False파라미터도 몇 번 반복한 후 새 줄에 인쇄되었습니다.진행률 표시줄을 보면 이러한 경우를 쉽게 식별할 수 있습니다. 진행률 표시줄에 이상한 형식의 기호(예: 물음표)가 있으면 다음을 사용해 보십시오.ascii=True.

그래서 이것은 저에게 효과가 있었습니다.

from tqdm.auto import tqdm
...

with tqdm(data, position=0, leave=True, ascii=True) as iterator:
   for x in iterator:
      # do stuff
      ...

      iterator.set_postfix_str(msg)

수품tqdm.

from tqdm import tqdm

합니다. 먼저사시작다니합코드를을 사용합니다.tqdm여러 줄 출력 때문에 중지합니다.

다음을 수행합니다.

list(getattr(tqdm, '_instances'))

for instance in list(tqdm._instances):
    tqdm._decr_instances(instance)

오류가 발생하는 경우:

특성 오류: 'tqdm' 형식 개체에 '_instances' 특성이 없습니다.

당신은 먼저 코드를 시작해야 하고, 어디서 사용하는지 그리고 언급된 시작 코드 에만 시작해야 합니다.

이 에 당신의 그고이모조후에당의신작든리▁and의당.tqdm잘 될 겁니다.

leave=False내 경우에는 내부 루프가 작동했기 때문입니다.

for j in tqdm(outer_list):
    for i in tqdm(inner_list, leave=False):

사환경이 포함된 tqdm==4.38.0그리고.Python 3.6.7

제가 겪고 있는 문제는 흔하지 않을 수도 있지만, 누군가에게 유용할 경우를 대비하여 다른 변수를 콘솔에 인쇄하고 있었습니다.해당 인쇄를 사용하지 않도록 설정하면 문제가 해결됩니다.

사용해 보십시오.tqdm.tnrange()

for i in tqdm.tnrange(len(df)):

Ongoing image finished image

저는 tqdm 솔루션을 시도해 보았지만 스파이더(아나콘다)를 사용하고 있기 때문에 쓰기 명령과 인쇄 명령 간의 충돌로 인해 제 경우에는 예상대로 작동하지 않습니다.저는 가장 멋진 해결책은 아니지만 간단하고 효과적인 해결책을 생각해냈습니다.

def ybar(progr, total, step=50):
    #starts with 1
    l2=(progr/total)//(1/step)
    if progr==1: print(f'[{total}]: '+'|'*int(l2), end = '') 
    else:
        l1=((progr-1)/total)//(1/step) 

        ll=int(l2-l1)
        if l1 < l2: 

            for j in range(1,ll+1):
                if (int(l1)+j)%5==0:
                    print('*', end = '')
                else:
                    print('|', end = '')
        if progr==total: print("  DONE")

그 결과 단순해집니다. [100]:||||||

for i in range(1,101):
    ybar(i,len(range(1,101)),50)
    #something

여기에는 많은 솔루션이 있습니다: Python Progress Bar

https://github.com/tqdm/tqdm#parameters 가끔 tqdm이 encols=xx를 사용하여 줄 너비를 제한하는 화면 너비를 잡을 수 없는 것 같습니다. ex: tqdm(iter,ncols=80): # 줄 너비 제한=80

원래 질문은 리눅스 셸에 대한 것으로 보이지만,윈도우즈 명령줄에서 다음과 같은 작업이 수행되었습니다.

from tqdm import tqdm

for x in tqdm([1,2,3,4], leave=True, ncols=80, position=0):
    pass
    for y in tqdm([1,2,3,4], leave=False, ncols=80, position=1):
        pass

제안된 모든 수정 사항을 맹목적으로 시도하는 것보다 설명서를 읽었더라면 훨씬 더 빨리 정리했을 것입니다!

ㅠㅠfrom tqdm import tqdm_notebook as tqdmfrom tqdm import tqdm.

언급URL : https://stackoverflow.com/questions/41707229/why-is-tqdm-printing-to-a-newline-instead-of-updating-the-same-line

반응형