본문 바로가기
프로그래밍 관련/파이썬

파이썬 빌드진행률 출력 - rich progress

by 존버매니아.임베디드 개발자 2023. 7. 13.
반응형

Progress Display — Rich 13.4.2 documentation  
Rich 라이브러리 중에 Progress에 대한 공식 설명 페이지 링크


파이썬의 rich 라이브러리는 cmd 에 출력되는 내용에 색깔을 넣거나 간단한 이미지를 넣거나 하는 라이브러리다.
근데 제공되는 내용중에 progress 라는 클래스가 있는데 이걸활용하면 어떤 작업을 했을때, 소요시간을 실시간으로 볼 수 있고
진행률을 막대형태로 그려주기도 한다.
spinner라는것과 함께 쓰면 동그란 이미지가 돌아가는 모습으로 출력되서 동적인 느낌을 줄 수도 있다.

개요.  출력결과에 다양한 것을 나타낼 수 있는데,
Progress 변수 생성할 때 아래 생성자에 무엇을 넣냐에 따라 결과물이 달라짐.

 

동작 예시1)

소요시간만 측정해서 쭉 보여주는 코드

from rich.progress import Progress, SpinnerColumn, TimeElapsedColumn
import time

with Progress(f"output message", SpinnerColumn(), TimeElapsedColumn()) as progress:
    task = progress.add_task("",total = 1)
    cnt = 0
    while not progress.finished:
        cnt = cnt +1
        print(cnt)
        time.sleep(0.1)
        if cnt == 20:
            progress.update(task, completed=1)

 위 코드에서 add_task를 선언할 때 뒤에 total 이라는 파라미터는 이 task가 완료되기 위해 필요한 step 이 몇개인지를 의미한다.

아래에 update 함수의 completed는 현재까지 완료된 step 값을 몇으로 셋팅하는지를 의미한다.

위에서 add task 할 때 토탈이 1 인데,
update에서 completed 를 1로 했으니 그말은 태스크 완료를 의미하게된다.

 

동작 예시2) 동작진행 결과에 따라 막대기 출력

from rich.progress import Progress, SpinnerColumn, TimeElapsedColumn , BarColumn, TimeRemainingColumn
import time

with Progress(f"output message",BarColumn(), SpinnerColumn(), TimeElapsedColumn() ) as progress:
    task = progress.add_task("",total = 1)
    cnt = 0
    while not progress.finished:
        cnt = cnt +1
        print(cnt)
        time.sleep(0.1)
        progress.update(task, advance=0.1)

BarColumn = step이 완료될 수록 점점 막대기가 차오른다

 

add task 할 때 total이 1이다.

progress.update 함수에 advance 는 step 값을 의미한다.

그러니까.. 현재 완료된 값을 0.1씩 추가하는 거다.

위 예시의 경우 update 함수가 10번 불려야 total이 1이 되니까 태스크가 종료된다.

그리고 위 예시의 경우 예시1에서는 안썼던 BarColumn을 넣어서

advance로 step이 오를때마다 출력결과에 막대기가 하나씩 차게된다

 

동작 예시3) 진행률을 %로 표시 해줌

from rich.progress import Progress, SpinnerColumn, TimeElapsedColumn , BarColumn, TimeRemainingColumn,TaskProgressColumn
import time

with Progress(f"output message",BarColumn(),TaskProgressColumn(), SpinnerColumn(), TimeElapsedColumn() ) as progress:
    task = progress.add_task("",total = 1)
    cnt = 0
    while not progress.finished:
        cnt = cnt +1
        print(cnt)
        time.sleep(0.1)
        progress.update(task, advance=0.1)
반응형