오랜 시간이 걸리는 처리가 어디에 있고 언제 완료될지 궁금한 적이 있습니까? 일반적으로 충돌이 발생하지 않았는지 확인하기 위해 RETURN
여러 번 누르시거나 SSH 연결이 정지되지 않았습니까? 번거로움 없이 일부 처리를 일시 중지 하고 Python 프롬프트로 돌아가서 일부 항목을 수동으로 수정한 다음 원활하게 다시 시작할 수 있으면 좋겠다고 생각한 적이 있습니까? 내가 그랬어...
나는 이 모든 것에 대해 생각하면서 이 새로운 진행률 표시줄을 시작했습니다. 살아있는 진행 상황을 보십시오! ?
Python 진행률 표시줄의 최신 개념을 소개합니다! alive-progress
차별화된 다양한 멋진 기능을 갖춘 독보적인 앱입니다. 다음은 몇 가지 주요 내용입니다.
check()
도구도 있습니다! 생성된 프레임과 애니메이션 사이클이 화면에서 어떻게 보이고 폭발하는지 확인할 수 있으며, alive-progress
에서 설치하기 전에 살아있는 모습도 볼 수 있습니다! 세상에서 가장 멋진 도구예요! 창의력을 발휘해보세요! 이 README는 항상 발전하고 있으므로 때때로 보다 포괄적인 내용을 살펴보십시오... 다른 섹션에서 새롭고 멋진 세부 정보를 찾을 수 있습니다! ?
alive-progress
사용bar()
핸들러 약 1년 동안 안정적인 안정성을 유지한 끝에 마침내 새로운 alive-progress
출시되었습니다!
주요 기능 및 개선 사항은 다음과 같습니다.
bar()
0
및 -N
으로 호출하여 뒤로 이동할 수 있습니다! 반복에서 어떤 진전도 이룰 수 없거나 무언가를 롤백해야 할 때 유용합니다!그리고 더!
enrich_offset
지정할 수 있으므로 on 1:
시작하거나 이전 계산에서 떠난 곳에서 계속할 수 있습니다! 여기에 매우 멋진 업데이트가 있습니다! 작업을 마무리하고 터미널 지원을 개선하는 것 외에도 이제 alive-progress
계산 재개를 지원합니다!
대규모 데이터 세트나 시간이 오래 걸리는 작업을 처리할 때 일괄 처리를 사용하거나 부분 결과를 캐시할 수 있습니다. 그런 다음 중지했다가 다시 시작하면 이미 완료된 모든 항목을 매우 빠르게 건너뛰게 되어 alive_bar
가 초당 수천 개의 항목을 처리하고 있다고 생각하게 되고 결과적으로 ETA가 완전히 망가집니다. 하지만 더 이상은 아닙니다. ! bar()
항목을 건너뛰었다고 말하세요...?
다음 두 가지 방법으로 사용할 수 있습니다.
1. 어디에서 멈췄는지 알고 있는 경우:
with alive_bar ( 120000 ) as bar :
bar ( 60000 , skipped = True )
for i in range ( 60000 , 120000 ):
# process item
bar ()
네, 항목 수와 함께 bar(N, skipped=True)
한 번만 호출하면 됩니다.
2. 모르거나 물품이 흩어져 있는 경우
with alive_bar ( 120000 ) as bar :
for i in range ( 120000 ):
if done ( i ):
bar ( skipped = True )
continue
# process item
bar ()
네, 그렇게 간단합니다! 항목이 이미 완료되면 bar(skipped=True)
호출하고, 그렇지 않으면 평소대로 bar()
호출하면 됩니다. 또한 해당 항목을 건너뛰었는지 여부를 알려주는 bool과 함께 마지막에 단일 bar(skipped=?)
호출을 공유할 수도 있습니다. 멋지죠?
또한 이 버전에서는:
max_cols
구성 설정, jupyter 및 크기를 지원하지 않는 기타 플랫폼에서와 같이 가져올 수 없는 경우 사용할 열 수네, 드디어 이 버전을 출시할 수 있었습니다! 다음은 새로운 기능입니다.
B
, bytes
또는 °C
와 같은 라벨을 붙일 수 있습니다!sys.stdout
대신 sys.stderr
및 기타 파일 사용 지원!매우 기대되는 수정 사항:
TypeError: unhashable type: 'types.SimpleNamespace'
없습니다.RotatingFileHandler
사용 시 로깅 지원! 네, 지원을 요청하세요.그리고 마지막으로, 진행 상황을 즐길 수 있도록 더욱 세련된 레이아웃이 제공됩니다!
이제 alive_bar
이중선 텍스트 모드를 지원합니다!
막대 안에 더 긴 상황 메시지를 포함하고 싶었다면 아마도 한 줄에 갇히는 느낌을 받았을 것입니다. 필요한 것을 확인하려면 아름답게 움직이는 막대를 축소해야 했고, 심지어 위젯을 제거(!)해야 했습니다...
더 이상은 안돼!! 이제 막대를 이중선으로 만들고 그 아래에 텍스트를 넣을 수 있습니다!
예, 전체 막대 아래에 메시지가 있고 그 위로 다른 인쇄/로깅 메시지가 스크롤됩니다!
letters = [ chr ( ord ( 'A' ) + x ) for x in range ( 26 )]
with alive_bar ( 26 , dual_line = True , title = 'Alphabet' ) as bar :
for c in letters :
bar . text = f'-> Teaching the letter: { c } , please wait...'
if c in 'HKWZ' :
print ( f'fail " { c } ", retry later' )
time . sleep ( 0.3 )
bar ()
산출:
on 7: fail "H", retry later
on 10: fail "K", retry later
Alphabet |███████████████████████████▊ | ▃▅▇ 18/26 [69%] in 6s (3.2/s, eta: 3s)
-> Teaching the letter: S, please wait...
또한 alive_it
에는 최종 영수증의 제목 및/또는 텍스트를 설정할 수 있는 새로운 finalize
함수 매개변수와 사용자 정의된 로거를 감지하는 향상된 로깅 지원이 있습니다.
이것은 모두 사용자 정의에 관한 것입니다. 이제 핵심 위젯을 변경할 수 있습니다:
monitor
, elapsed
및 stats
위젯에 문자열을 보내 원하는 대로 보이도록 만드세요!이 문자열이 모든 Python 형식 기능을 지원한다는 것은 놀랍습니다. 예를 들어
{percent:.1%}
.
최종 영수증을 받으면 추가로 맞춤 설정할 수 있습니다!
monitor_end
, elapsed_end
및 stats_end
!영수증에 표시되지 않도록 이전에 위젯을 숨겼다면 이제 위젯의 모든 모습을 볼 수 있고 영수증만 숨길 수 있습니다! 아니면 그 반대인가요?
또 다른 추가 기능인 현재 alive-progress
중지될 때마다 멋진 최종 영수증을 아름답게 렌더링합니다. 너무 일찍 Ctrl+C를 사용하더라도 마찬가지입니다! 왜 그 전에는 그런 생각을 해보지 않았는지 모르겠네요...
Download |██████████████████︎ | (!) 45/100 [45%] in 4.8s (9.43/s)
마지막으로 CTRL+C를 전혀 비활성화하도록 선택할 수 있습니다! 기본값은 더 안전한 ctrl_c=True
이며, 이는 CTRL-C를 평소처럼 작동하게 만듭니다.
ctrl_c=False
를 비활성화하면 대화형 alive_bar
를 훨씬 더 원활하게 사용할 수 있습니다(중지하면 스택 추적이 없음). 그리고/또는 프로그램의 최상위 수준에 있는 경우!
주의: 예를 들어 for 루프 안에 있는 경우 다음 반복으로 계속 진행됩니다. 이는 원하는 것일 수도 있고 아닐 수도 있습니다...
for i in range ( 10 ):
with alive_bar ( 100 , ctrl_c = False , title = f'Download { i } ' ) as bar :
for i in range ( 100 ):
time . sleep ( 0.02 )
bar ()
산출:
Download 0 |████████▊︎ | (!) 22/100 [22%] in 0.6s (36.40/s)
Download 1 |████████████████▊︎ | (!) 42/100 [42%] in 1.0s (41.43/s)
Download 2 |██████▍︎ | (!) 16/100 [16%] in 0.4s (39.29/s)
Download 3 |█████▋︎ | (!) 14/100 [14%] in 0.4s (33.68/s)
Download 4 |█████████████▎︎ | (!) 33/100 [33%] in 0.8s (39.48/s)
Download 5 |███████▎︎ | (!) 18/100 [18%] in 0.5s (37.69/s)
Download 6 |█████▎︎ | (!) 13/100 [13%] in 0.3s (37.28/s)
Download 7 |████████████︎ | (!) 30/100 [30%] in 0.8s (38.43/s)
Download 8 |██████︎ | (!) 15/100 [15%] in 0.4s (36.26/s)
...
자주 요청되었던 몇 가지 주요 새 기능이 마침내 출시되었습니다!
click.echo()
인쇄에 대한 새로운 지원 예! 이제 alive-progress
Jupyter 노트북을 지원하며 비활성화 상태도 포함합니다! 두 가지 모두 많은 관심을 받았고 마침내 상륙했습니다!
그리고 더 좋은 점은 jupyter 노트북에 대한 자동 감지 메커니즘을 구현했기 때문에 코드를 변경하지 않고도 즉시 작동한다는 것입니다!!
직접 확인해보세요:
매우 잘 작동하는 것 같지만 현재로서는 실험적인 것으로 간주되어야 합니다.
두 개의alive_bar
새로 고침이 서로 겹치지 않고 함께 연결되는 등 일부 시각적 결함이 나타나는 경우가 있었습니다... 그리고 제 생각에는 이 문제를 해결할 수 없을 것 같습니다. Jupyter가 가끔 이상한 시간에 캔버스를 새로 고치는 것 같습니다. 이로 인해 일부 데이터가 손실됩니다. 더 재미있는 일이 발생하면 문제에 대해 알려주시기 바랍니다.
이것은 alive-progress
에 있어 중요한 돌파구입니다!
개발하는 데 1년이 걸렸고 제가 성취한 것이 매우 자랑스럽습니다 o/
.check()
도구입니다! 완전한 프레임 데이터, 내부 코드 포인트, 심지어 애니메이션까지 포함할 수도 있습니다! ?alive-progress
위젯 비활성화 지원을 포함하여 모양을 사용자 정의하기 위한 몇 가지 새로운 구성 옵션!bar()
호출하는 새로운 반복기 어댑터인 alive_it
이 포함되어 있습니다!이는 주요 버전 변경이므로 직접적인 이전 버전과의 호환성은 보장되지 않습니다. 처음에 뭔가가 작동하지 않으면 새로운 가져오기 및 함수의 서명을 확인하면 됩니다. 이전의 모든 기능은 여기서도 계속 작동합니다! ?
alive-progress
사용pip로 설치하면 됩니다:
❯ pip install alive-progress
어떤 스타일이 내장되어 있는지 궁금하다면 지금이 바로 showtime
입니다! ;)
from alive_progress . styles import showtime
showtime ()
참고: 아래 애니메이션 GIF의 경로를 무시하세요. 올바른 경로는 위에 있습니다. 이러한 긴 GIF는 생성하는 데 시간이 많이 걸리기 때문에 모든 변경 사항에 대해 추가 작업을 수행할 수는 없습니다. 이해해 주셔서 감사합니다.
나는 내가 만든 모든 애니메이션 팩토리를 시험해 보기 위해 이러한 스타일을 만들었지만 그 중 일부는 매우 멋진 결과를 가져온 것 같습니다! 마음대로 사용하고 마음껏 섞어보세요!
직접 시도하기 전에 시스템에서 실제로 실행 중인 실제 alive-progress
표시줄을 보고 싶으십니까?
❯ python -m alive_progress.tools.demo
멋지죠?? 이제 ipython
REPL을 입력하고 다음을 시도해 보세요.
from alive_progress import alive_bar
import time
for x in 1000 , 1500 , 700 , 0 :
with alive_bar ( x ) as bar :
for i in range ( 1000 ):
time . sleep ( .005 )
bar ()
프로세스 전반에 걸쳐 멋진 애니메이션과 함께 다음과 같은 내용을 볼 수 있습니다.
|████████████████████████████████████████| 1000/1000 [100%] in 5.8s (171.62/s)
|██████████████████████████▋︎ | (!) 1000/1500 [67%] in 5.8s (172.62/s)
|████████████████████████████████████████✗︎ (!) 1000/700 [143%] in 5.8s (172.06/s)
|████████████████████████████████████████| 1000 in 5.8s (172.45/s)
좋은데, 응? 마음에 들었나요? 그럴 줄 알았어, 고마워요?.
실제로 사용하려면 다음과 같이 alive_bar
컨텍스트 관리자에 일반 루프를 래핑하면 됩니다.
with alive_bar ( total ) as bar : # declare your expected total
for item in items : # <<-- your original loop
print ( item ) # process each item
bar () # call `bar()` at the end
그리고 그것은 살아있습니다! ?
간단히 말해서, 항상 항목을 검색하고 항목 수와 함께 alive_bar
컨텍스트 관리자를 입력한 다음 마지막에 bar()
호출하여 해당 항목을 반복/처리합니다! 그것은 간단합니다! :)
items
쿼리 세트와 같이 반복 가능한 항목일 수 있습니다.alive_bar
의 첫 번째 인수는 쿼리 세트의 경우 qs.count()
, 길이가 있는 반복 가능 항목의 경우 len(items)
또는 정적 숫자와 같은 예상 총계입니다.bar()
호출은 막대를 앞으로 이동하게 만드는 것입니다. 일반적으로 항목을 마친 직후 매 반복마다 호출합니다.bar()
너무 많이(또는 마지막에 너무 적게) 호출하면 막대는 예상 total
와의 편차를 그래픽으로 렌더링하여 오버플로 및 언더플로를 매우 쉽게 확인할 수 있습니다.bar.current
호출하세요.창의력을 발휘할 수 있습니다!
bar()
호출할 때만 막대가 앞으로 이동하므로 루프와 독립적 입니다! 따라서 이를 사용하여 보류 중인 트랜잭션, 깨진 항목 등 원하는 것을 모니터링하거나 동일한 반복에서 두 번 이상 호출할 수도 있습니다! 따라서 결국에는 전체에 대한 비율을 포함하여 "특별" 이벤트가 몇 개나 있었는지 알게 될 것입니다!
alive_bar
컨텍스트 내에서 현재 표시되는 진행률 표시줄과 밀접하게 통합된 메시지를 쉽게 표시할 수 있습니다! 어떤 식으로든 깨지지 않으며 메시지를 더욱 풍성하게 만들어 줄 것입니다!
bar.text('message')
및 bar.text = 'message'
막대 내에 상황별 메시지를 설정하여 현재 항목이나 처리 단계에 대한 내용을 표시할 수 있습니다.bar.title('Title')
및 bar.title = 'Title'
사용하여 언제든지 변경할 수 있는 (? 새로운) 동적 제목 — bar가 변경되지 않도록 하려면 title_length
와 혼합하세요. 길이;alive_bar
줄을 깔끔하게 정리하고 당시의 현재 막대 위치와 함께 메시지를 인쇄한 다음 바로 아래에 막대를 계속 표시하는 일반적인 Python print()
문입니다.logging
프레임워크도 이전 프레임워크와 똑같이 강화되었습니다.click.echo()
사용하여 스타일이 지정된 텍스트를 인쇄할 수도 있습니다.정말 멋지죠? 그리고 이 모든 기능은 터미널이나 Jupyter 노트북에서 동일하게 작동합니다!
이제 무엇이든 모니터링할 수 있는 더 빠른 방법이 생겼습니다! 여기에서는 항목이 자동으로 추적됩니다!
alive_it
=> alive_bar
반복자 어댑터를 보십시오!
물건을 이것으로 감싸고 평소처럼 반복하세요!
바는 작동합니다. 그것은 매우 간단합니다!
from alive_progress import alive_it
for item in alive_it ( items ): # <<-- wrapped items
print ( item ) # process each item
얼마나 멋지나요?! ?
모든 alive_bar
매개변수는 적용되지만 total
은 더 똑똑하고(제공되지 않으면 len
또는 length_hint
사용하여 데이터에서 자동으로 추론됩니다) 여기서는 의미가 없는 manual
입니다.
거기에는 bar
손잡이가 전혀 없습니다. 하지만 문자 메시지를 설정하거나 현재 진행 상황을 검색하는 등의 작업을 원한다면 어떻게 해야 할까요?
다음과 같이 alive_it
변수에 할당하면 내부 alive_bar
와 상호 작용할 수 있습니다.
bar = alive_it ( items ) # <<-- bar with wrapped items
for item in bar : # <<-- iterate on bar
print ( item ) # process each item
bar . text ( f'ok: { item } ' ) # WOW, it works!
반복자 어댑터가 자동으로 항목을 추적하므로 이는 bar()
지원하지 않는 약간 특별한 bar
입니다. 또한 최종 영수증의 제목 및/또는 텍스트를 설정할 수 있는 finalize
지원합니다.
alive_it ( items , finalize = lambda bar : bar . text ( 'Success!' ))
...
간단히 말해서:
- 전체 사용은 항상
with alive_bar() as bar
원할 때마다bar()
반복하고 호출합니다.- 빠른 어댑터 사용은 항목이 자동으로 추적되는
for item in alive_it(items)
됩니다.- 전체 어댑터 사용은
bar = alive_it(items)
입니다. 여기서 항목이 자동으로 추적되는 것 외에도 원하는대로alive_progress
내부를 사용자 정의할 수 있는 특수 반복 가능한bar
제공됩니다.
기본 모드는 자동 및 알 수 없음 이며 내부적으로 카운터를 사용하여 진행 상황을 추적합니다. 처리된 항목 수를 계산하고 이를 사용하여 그에 따라 진행률 표시줄을 업데이트합니다.
total
인수는 선택 사항입니다. 이를 제공하면 막대가 자동 모드 로 들어갑니다. 이 모드에서는 작업 진행 상황이 자동으로 추적되며 정확한 막대, 스피너, 백분율, 카운터, 처리량 및 ETA 등 alive-progress
제공하는 모든 위젯을 사용할 수 있습니다.
total
제공하지 않으면 막대가 알 수 없는 모드 로 들어갑니다. 이 모드에서는 진행 상황을 확인할 수 없으므로 ETA가 표시되므로 전체 진행률 표시줄이 계속해서 애니메이션으로 표시됩니다. 사용 가능한 위젯은 애니메이션 막대, 스피너, 카운터 및 처리량입니다.
멋진 스피너는 애니메이션 막대와 완전히 독립적으로 실행되며 둘 다 자체 애니메이션을 동시에 실행하여 터미널에 독특한 쇼를 렌더링합니다! ?
마지막으로, 자동 모드에는 고유한 기능이 있습니다. 항목을 건너뛴 것으로 표시하여 처리량과 ETA를 훨씬 더 정확하게 만듭니다! 이에 대해서는 나중에 자세히 설명하겠습니다.
manual=True
인수에 의해 수동으로 활성화되는 수동 모드는 내부적으로 백분율을 사용하여 진행 상황을 추적합니다. 이를 통해 바 위치를 완벽하게 제어할 수 있습니다. 일반적으로 완료율만 제공하는 프로세스를 모니터링하거나 임의의 특수 효과를 생성하는 데 사용됩니다.
alive_bar
와 함께 직접 사용하거나 config_handler
통해 사용할 수 있으며 bar()
핸들러에 백분율을 보낼 수 있습니다! 예를 들어 완료율을 15%로 설정하려면 bar(0.15)
호출하면 됩니다. 이는 15/100입니다.
여기에 total
제공할 수도 있습니다. 그렇게 하면 alive-progress
자동으로 내부 카운터를 추론하여 자동 모드에서 사용할 수 있는 것과 동일한 위젯을 모두 제공할 수 있습니다!
total
제공하지 않으면 최소한 "%/s"(초당 백분율) 및 100%까지 각각 계산된 대략적인 처리량 및 ETA 위젯 버전을 얻게 됩니다. 둘 다 매우 정확하지는 않지만 아무것도 없는 것보다는 낫습니다.
total
제공되면 모든 것이 멋집니다.
방법 | 계수기 | 백분율 | 처리량 | 도착 예정 시간 | 오버플로우/언더플로우 |
---|---|---|---|---|---|
자동 | ✅ (사용자 체크) | ✅ (추론) | ✅ | ✅ | ✅ |
수동 | ✅ (추론) | ✅ (사용자 설정) | ✅ | ✅ | ✅ |
그렇지 않은 경우 다음과 같이 몇 가지 타협을 해야 합니다.
방법 | 계수기 | 백분율 | 처리량 | 도착 예정 시간 | 오버플로우/언더플로우 |
---|---|---|---|---|---|
알려지지 않은 | ✅ (사용자 체크) | ✅ | |||
수동 | ✅ (사용자 설정) | ✅ |
하지만 실제로는 이해하기 쉽습니다. 어떤 모드를 사용해야 할지 생각할 필요가 없습니다!
total
있으면 항상 보내고, 필요한 경우 manual
사용하세요!그게 다야! 그것은 최선을 다해 작동할 것입니다! ? 영형/
bar()
핸들러 bar()
핸들러는 모드에 따라 상대 또는 절대 의미를 지원합니다.
bar()
호출하여 카운터를 1씩 증가시키거나 bar(200)
과 같은 다른 증분을 보내 한 번에 200씩 증가시킬 수 있습니다.필요한 경우 유지하거나 감소시키기 위해
bar(0)
및bar(-5)
도 지원합니다!
bar(0.35)
호출하여 막대가 즉시 35% 진행률로 점프하도록 할 수 있습니다.두 모드 모두 창의력을 발휘할 수 있게 해줍니다! 바를 원하는 위치로 즉시 이동시킬 수 있으므로 다음을 수행할 수 있습니다.
- 뒤로 이동하게 합니다. 예를 들어 무언가의 시간 초과를 그래픽으로 표시합니다.
- 특수 효과를 생성합니다. 예를 들어 일종의 실시간 아날로그 게이지를 모방합니다.
bar()
원하는 만큼 호출할 수 있습니다! 터미널 새로 고침 빈도는 항상 현재 처리량 및 진행률에 따라 비동기식으로 계산되므로 필요한 것보다 더 많은 업데이트로 터미널에 스팸을 보낼 위험이 없습니다.
어떤 경우든 현재 카운터/백분율을 검색하려면 bar.current
호출하면 됩니다.
마지막으로, bar()
핸들러는 자동 모드 고유 기능을 활용합니다. 이를 사용하려면 bar(skipped=True)
또는 bar(N, skipped=True)
호출하기만 하면 됩니다. skipped
True
로 설정하면 관련 항목이 처리량 계산에서 제외되어 건너뛴 항목이 ETA에 부정확하게 영향을 미치는 것을 방지합니다.
오픈 소스 프로젝트를 유지 관리하는 것은 어렵고 시간이 많이 소요되는 일입니다. 저는 이에 많은 ❤️과 노력을 쏟았습니다.
제 작업에 감사하셨다면 기부로 저를 후원하실 수 있습니다! 감사합니다 ?
showtime
전시회에는 Show.SPINNERS
(기본값), Show.BARS
또는 Show.THEMES
중 어떤 쇼를 보여줄 것인지 선택하는 선택적 인수가 있습니다. 한번 살펴보세요! ;)
from alive_progress . styles import showtime , Show
showtime ( Show . BARS )
showtime ( Show . THEMES )
참고: 아래 애니메이션 GIF의 경로를 무시하세요. 올바른 경로는 위에 있습니다. 이러한 긴 GIF는 생성하는 데 시간이 많이 걸리기 때문에 모든 변경 사항에 대해 추가 작업을 수행할 수는 없습니다. 이해해 주셔서 감사합니다.
그리고 테마 중 하나(? 2.0의 새로운 기능):
showtime
전시회에는 일부 맞춤 옵션도 허용됩니다.
예를 들어 해양 쇼를 보려면 showtime(pattern='boat|fish|crab')
사용할 수 있습니다.
단축어
show_bars()
,show_spinners()
및show_themes()
를 사용하여 이러한 쇼에 액세스할 수도 있습니다!
사용자 정의 스피너와 막대에 넣을 멋진 문자를 찾거나 터미널이 유니코드 문자를 지원하는지 확인하는 데 도움이 되는
print_chars()
라는 작은 유틸리티도 있습니다.
모양과 행동을 모두 사용자 정의할 수 있는 몇 가지 옵션이 있습니다!
이들 모두는 alive_bar
에서 직접 설정하거나 config_handler
에서 전역적으로 설정할 수 있습니다!
옵션은 다음과 같습니다. 괄호 안의 기본값은 다음과 같습니다.
title
: 선택사항이며 항상 표시되는 막대 제목length
: [ 40
] 애니메이션 진행률 표시줄을 렌더링할 열 수max_cols
: [ 80
] jupyter에서와 같이 가져올 수 없는 경우 사용할 최대 열입니다.spinner
: 막대 옆에 렌더링될 스피너 스타일bar
: 알려진 모드에서 렌더링될 막대 스타일unknown
: 알 수 없음 모드에서 렌더링할 막대 스타일theme
: [ 'smooth'
] 일치하는 스피너, 막대 및 알 수 없는 세트force_tty
: [ None
] 강제로 애니메이션을 켜거나 끄거나 tty에 따라 설정합니다(자세한 내용은 여기 참조).file
: [ sys.stdout
] 사용할 파일 객체: sys.stdout
, sys.stderr
또는 유사한 TextIOWrapper
disable
: [ False
] True이면 모든 출력을 완전히 비활성화하고 후크를 설치하지 않습니다.manual
: [ False
] 막대 위치를 수동으로 제어하도록 설정됨enrich_print
: [ True
] 막대 위치로 print() 및 로깅 메시지를 강화합니다.enrich_offset
: [ 0
] rich_print에 적용할 오프셋receipt
: [ True
] 멋진 최종 영수증을 인쇄하고, False인 경우 비활성화합니다.receipt_text
: [ False
] 최종 영수증에서 마지막 문자 메시지를 반복하도록 설정됩니다.monitor
(bool|str): [ True
] 모니터 위젯을 152/200 [76%]
구성합니다.{count}
, {total}
및 {percent}
가 포함된 문자열을 보내세요.elapsed
(bool|str): [ True
] 경과 시간 위젯을 in 12s
구성합니다.{elapsed}
가 포함된 문자열을 보내세요.stats
(bool|str): [ True
] 통계 위젯을 구성합니다 (123.4/s, eta: 12s)
{rate}
및 {eta}
가 포함된 문자열을 보내세요.monitor_end
(bool|str): [ True
] 최종 수신 내에서 모니터 위젯을 구성합니다.monitor
의 형식을 상속합니다.elapsed_end
(bool|str): [ True
] 최종 영수증 내에서 경과 시간 위젯을 구성합니다.elapsed
의 형식을 상속받습니다.stats_end
(bool|str): [ True
] 최종 영수증 내에서 통계 위젯을 구성합니다.{rate}
이 포함된 문자열을 보내세요(통계와 관련 없음).title_length
: [ 0
] 제목 길이를 고정하거나 0으로 무제한인 경우spinner_length
: [ 0
] 스피너 길이를 강제하거나 자연 길이의 경우 0
입니다.refresh_secs
: [ 0
] 새로 고침 기간을 강제로 적용하고 0
은 반응적 시각적 피드백입니다.ctrl_c
: [ True
] False인 경우 CTRL+C를 비활성화합니다(캡처함).dual_line
: [ False
] True인 경우 막대 아래에 텍스트를 배치합니다.unit
: 엔터티에 라벨을 붙이는 텍스트scale
: 단위에 적용할 스케일링: None
, SI
, IEC
또는 SI2
False
또는 ''
-> None
, True
-> SI
, 10
또는 '10'
-> SI
, 2
또는 '2'
-> IEC
precision
: [ 1
] 크기 조정 시 소수점 이하 자릿수가 표시됩니다. 또한 alive_bar
컨텍스트에서 로컬로만 설정할 수 있는 것도 있습니다:
calibrate
: 애니메이션 속도를 보정하기 위한 최대 이론적 처리량(자세한 내용은 여기 참조) 로컬로 설정하려면 alive_bar
에 키워드 인수로 보내면 됩니다.
with alive_bar ( total , title = 'Processing' , length = 20 , bar = 'halloween' ) as bar :
...
전역적으로 사용하려면 config_handler
로 보내면 그 이후에 생성된 모든 alive_bar
에 해당 옵션이 포함됩니다! 그리고 이를 혼합하고 일치시킬 수 있으며 로컬 옵션은 항상 전역 옵션보다 우선합니다.
from alive_progress import config_handler
config_handler . set_global ( length = 20 , spinner = 'wait' )
with alive_bar ( total , bar = 'blocks' , spinner = 'twirls' ) as bar :
# the length is 20, the bar is 'blocks' and the spinner is 'twirls'.
...
네, 스피너를 직접 조립할 수 있습니다! 그리고 그것은 쉽습니다!
저는 다양한 특수 효과를 만들었으므로 원하는 방식으로 혼합하고 일치시킬 수 있습니다! 프레임, 스크롤, 바운싱, 순차, 나란히 및 지연된 스피너가 있습니다! 창의력을 발휘하세요! ?
스피너의 애니메이션은 메타 팩토리, 팩토리 및 생성기의 여러 계층 내에서 매우 발전된 생성기 표현으로 설계되었습니다.
alive_bar
및 config_handler
모두에 보낼 객체입니다.이러한 생성기는 스피너 동작에 따라 다양한 애니메이션 주기를 수행할 수 있습니다. 예를 들어 튀는 스피너는 한 주기를 실행하여 피사체를 장면으로 부드럽게 가져온 다음 반대쪽까지 반복적으로 위치를 변경한 다음 장면에서 부드럽게 사라지도록 할 수 있습니다. > 그리고 이것은 모두 하나의 사이클일 뿐입니다! 그런 다음 모든 것을 다시 거꾸로 만들 수 있는 또 다른 주기가 뒤따를 수 있습니다! 그리고 바운싱 스피너는 오른쪽과 왼쪽 방향 모두에서 서로 다른 교대 패턴을 허용하므로 모든 조합의 데카르트 곱을 생성하고 반복을 시작할 때까지 수십 개의 서로 다른 사이클을 생성할 수 있습니다!! ?
그리고 이 애니메이션 시스템에서 얻은 가장 인상적인 성과 중 하나가 더 있다고 생각합니다(스피너 컴파일러 자체 외에). 현재 주기가 소진되지 않을 때까지 더 많은 애니메이션 프레임만 생성한 다음 스스로 정지합니다 ! 네, 다음 주기는 아직 시작되지 않았습니다! 이 동작은 애니메이션이 방해받지 않는 정확한 지점에서 자연스러운 중단을 생성하므로 내가 원하는 다른 애니메이션과 원활하게 연결할 수 있습니다!!
여기에는 모든 종류의 멋진 의미가 있습니다. 사이클은 서로 다른 프레임 수, 서로 다른 화면 길이를 가질 수 있고 동기화할 필요가 없으며 서로 다른 긴 시퀀스를 스스로 생성할 수 있고 사이클을 순서대로 또는 나란히 재생하기 위해 협력할 수 있습니다. 어떠한 간섭도 없이 완전히 다른 여러 애니메이션을 동시에 표시하는 것은 당신을 놀라게 할 수 있습니다!
거의 마치... 살아 있는 것 같았어요!! ?
==> 네, 여기서 이 프로젝트의 이름이 유래되었습니다!
이제 이러한 사이클 및 프레임 생성기는 Spinner Compiler 에 의해 미리 완전히 소비됩니다! 이것은 넓은 문자나 복잡한 문자소 클러스터가 있는 경우에도 이러한 모든 애니메이션이 작동할 수 있도록 셀 아키텍처 내부에서 만든 매우 멋진 새 프로세서입니다! 이러한 클러스터가 유니코드 인코딩을 손상시키지 않고 특히 모든 프레임에서 원래 길이를 유지하면서 점진적으로 프레임에 들어가고 나가도록 만드는 것은 매우 어려웠습니다. 예, 연속된 여러 문자는 완전히 다른 기호를 나타낼 수 있으므로 분리될 수 없습니다! 그들은 항상 동시에 프레임에 들어가고 나가야 합니다. 그렇지 않으면 문자소가 전혀 표시되지 않습니다(예: 이모티콘)!! 스피너 컴파일러 에 들어가세요 ......
이로 인해 놀라운 일이 가능해졌습니다!! 이 컴파일러는 전체 스피너 프레임 데이터를 미리 생성하므로 다음과 같습니다.
따라서 애니메이션을 재생할 준비가 된 모든 것을 수집하고 완료할 수 있으며 런타임 오버헤드가 전혀 없습니다 !! ?
또한 컴파일되고 유지된 전체 프레임 데이터를 사용하여 모양 변경, 문자 교체, 시각적 일시 중지(프레임 반복) 추가, 모든 콘텐츠에 대해 필요에 따라 바운싱 효과 생성, 주기 전치 등 해당 데이터를 리팩터링 하는 여러 명령을 만들 수 있었습니다. 프레임으로!!
그런데 이러한 효과를 어떻게 볼 수 있습니까? 당신이 만든 효과가 좋아 보이나요? 아니면 생각대로 되지 않는 걸까요? 예, 이제 생성된 모든 주기와 프레임을 매우 아름다운 표현으로 분석적으로 볼 수 있습니다!!
나는 여기서 달성한 것을 좋아합니다. 그것은 아마도 내가 만든 도구 중 가장 아름다운 도구일 것입니다... check
도구를 보십시오!!
내가 직접 그렇게 말하면 정말 멋지지 않나요? 그리고 내가 자랑스럽게 생각하는 매우 복잡한 소프트웨어, 원한다면 코드를 살펴보십시오.
그리고 check
도구가 훨씬 더 강력합니다! 예를 들어, 프레임의 코드 포인트를 볼 수 있습니다 !!! 그리고 왜이 버전이 왜 그렇게 어렵고 복잡한지를 엿볼 수 있습니다.
빨간색으로, 당신은 실제 크기에 관계없이 하나 또는 두 개의 "논리적 위치"를 차지하는 그래프 클러스터를 볼 수 있습니다 ... 이것은 새로운 셀 아키텍처 의 "셀"입니다 ...
이모티콘 깃발이 얼마나 멋진 지보세요 :
깃발은 "반 간격"을 사용하기 때문에 매끄럽게 움직이는 것 같습니다! 넓은 숯이기 때문에 alive-progress
그것이 "두 개의 가시 숯"으로 렌더링 될 것이라는 것을 알고 있으며, 애니메이션은 이것을 고려하지만 하나만 차지하는 공간으로 구성됩니다. 혼합 배경을 사용하면 상황이 훨씬 더 복잡합니다 ...
내가 만든 공장의 유형은 다음과 같습니다.
frames
: 마음대로 모든 문자를 그립니다.scrolling
: 한쪽에서 다른쪽으로 부드러운 흐름을 생성하고, 뒤에 숨어 있거나 보이지 않는 경계를 감싸십시오. 한 번에 하나씩 주제를 사용하여 여러 개의 별개의 문자를 생성 할 수 있습니다.bouncing
: scrolling
과 비슷하지만 애니메이션이 시작으로 되돌아 가서 뒤에 숨어 있거나 보이지 않는 경계를 즉시 튀는 것입니다.sequential
소수의 공장을 얻고 다른 공장을 순차적으로 연주합니다! 그들을 혼합 할 수 있는지 여부;alongside
의 공장을 얻고 동시에 공장을 연주하십시오. 왜 모든 것을 가질 수있을 때를 선택합니까?! 애니메이션의 피벗을 선택할 수 있습니다.delayed
: 다른 공장을 여러 번 복사하여 각 프레임에 점점 더 많은 프레임을 건너 뛰고 있습니다! 여기에서 매우 멋진 효과가 이루어집니다!자세한 내용은 매우 완전한 Docstrings를 참조하십시오.
바를 커스터마이징하는 것은 그 근처에 없습니다. 그들이 "즉시", 수동적 인 대상이라고 가정 해 봅시다. 그들은 애니메이션을 지원하지 않습니다. 즉, 동일한 매개 변수가 주어진 동일한 변환을 항상 생성합니다. 스피너는 길고 복잡한 시퀀스를 생성 할 수있는 무한 발전기임을 기억하십시오.
바에는 메타 공장이 있고, 클로저를 사용하여 스타일 매개 변수를 저장하고 추가 작동 매개 변수를받지 만 실제 공장은 자체적으로 컨텐츠를 생성 할 수 없습니다. 여전히 0과 1 사이의 부동 소수점 숫자 인 추가 매개 변수가 필요하며, 이는 자체적으로 렌더링하는 비율입니다.
alive_bar
카운터와 총계를 기준 으로이 비율을 자동으로 계산하지만manual
모드에서 직접 보낼 수 있습니다!
바에는 막대 컴파일러도 없지만 체크 도구를 제공합니다 !! ?
스피너처럼 넓은 숯과 일반 숯을 혼합하고 일치시킬 수도 있습니다! (그리고 모든 것이 완벽하게 정렬되어 있습니까?)
심장의 내용에 점검 도구를 사용하십시오 !! 그들은 당신을 기다리는 더 많은 음식, 심지어 실시간 애니메이션을 가지고 있습니다!
당신이 할 수있는 가장 멋진 애니메이션을 만들고 나에게 보내십시오!
사용자가 제공 한 스피너와 바와 함께 일종의contrib
패키지를 만드는 것에 대해 생각하고 있습니다!
와우, 여기까지 모든 것을 읽었다면 이제 alive-progress
사용에 대한 건전한 지식이 있어야합니다! ?
그러나 더 많은 흥미로운 것들이 있기 때문에 자신을 위조하십시오!
오픈 소스 프로젝트를 유지하는 것은 어렵고 시간이 많이 걸리며, 나는 이것에 많은 노력을 기울였습니다.
내 작품에 감사한다면 기부금으로 저를 백업 할 수 있습니다! 감사합니다 ?
오, 당신은 그것을 완전히 잠시 멈추고 싶어요. 이것은 놀라운 소설 개념으로 Afaik은 어디에서나 찾을 수 없습니다.
이것으로 당신은 지속적인 처리의 한가운데에 일부 아이템으로 수동 으로 행동하게됩니다 !!
그렇습니다. 프롬프트로 돌아가서 수정하고, 변경하고, 물건을 제출할 수 있으며, 바는 그 위치를 "기억"할 것입니다.
지불 거래를 조정해야한다고 가정 해 봅시다. 수천 개가 넘는 사람들을 반복하고 결함이있는 것을 감지하고 고칠 필요가 있습니다. 이 수정은 단순하거나 결정적이지 않으므로해야 할 일을 이해하기 위해 각각을 연구해야합니다. 수신자를 놓치거나 금액이 잘못되었거나 서버와 동기화되지 않을 수도 있습니다. 모든 가능성을 상상하기 어렵습니다.
일반적으로, 당신은 완료 될 때까지 감지 프로세스를 실행하고, 찾아 내고 기다리는 각 불일치, 잠재적으로 오랜 시간 동안, 마침내 고칠 수있을 때까지 목록에 추가해야합니다 ... 물론 청크를 처리함으로써 그것을 완화 할 수 있습니다. , 또는 인쇄하고 다른 껍질을 통해 행동하지만, 그 자체로 단점이 있습니다 ...?
이제 더 나은 방법이 있습니다! 실제 탐지 과정을 잠시 일시 중지하십시오! 그런 다음 다음 결함이 발견 될 때까지 기다려야하고 거의 실시간으로 행동하십시오!
일시 중지 메커니즘을 사용하려면 함수를 작성하면 코드가 상호 작용하려는 항목을 yield
할 수 있습니다. 당신은 아마도 이미 코드에서 하나를 사용하고 있지만 ipython
쉘이나 다른 대체에서는 그렇지 않을 것입니다. 따라서 디버그 코드를 함수로 래핑 한 다음 bar.pause()
컨텍스트에 입력하십시오 !!
def reconcile_transactions ():
qs = Transaction . objects . filter () # django example, or in sqlalchemy: session.query(Transaction).filter()
with alive_bar ( qs . count ()) as bar :
for transaction in qs :
if faulty ( transaction ):
with bar . pause ():
yield transaction
bar ()
그게 다야! 그것은 간단합니다! 영형/
이제 gen = reconcile_transactions()
실행하여 생성기를 인스턴스화하고 다음 결함 트랜잭션을 원할 때마다 next(gen, None)
! 나는 그것을 좋아한다 ...
alive-progress
Bar는 평소와 같이 시작하고 실행되지만 불일치가 발견 되 자마자 막대는 스스로 일시 중지되어 새로 고침 스레드를 끄고 정확한 상태를 기억하고 프롬프트에서 직접 거래를 산출합니다! 거의 마법입니다! ?
In [11]: gen = reconcile_transactions()
In [12]: next(gen, None)
|█████████████████████ | 105/200 [52%] in 5s (18.8/s, eta: 4s)
Out[12]: Transaction<#123>
그런 다음 ipython
의 일반적인 _
바로 가기로 트랜잭션을 검사 할 수 있습니다 (또는 t = next(gen, None)
으로 직접 할당). 모두 수정하도록 설정되어 있습니다!
완료되면 이전과 동일한 next
통화로 막대를 다시 활성화하십시오 !! 바는 다시 나타나고, 모든 것을 다시 켜고, 결코 멈추지 않은 것처럼 계속됩니다 !! 좋아, 마법이야?
In [21]: next(gen, None)
|█████████████████████ | ▁▃▅ 106/200 [52%] in 5s (18.8/s, eta: 4s)
최종 영수증이 나타날 때까지 헹구고 반복하면 더 이상 결함이 없습니다. ?
따라서 루프없이 고정 작업을 모니터링해야합니까?
확실히 작동 할 것입니다! 순진한 예는 다음과 같습니다 (우리는 잠시 후 더 잘할 것입니다) :
with alive_bar ( 4 ) as bar :
corpus = read_file ( file )
bar () # file was read, tokenizing
tokens = tokenize ( corpus )
bar () # tokens generated, processing
data = process ( tokens )
bar () # process finished, sending response
resp = send ( data )
bar () # we're done! four bar calls with `total=4`
모든 단계에 같은 시간이 걸린다고 가정하기 때문에 순진하지만 실제로는 각 단계를 완료하는 데 매우 다른 시간이 걸릴 수 있습니다. read_file
및 tokenize
매우 빠를 수 있으며, 이로 인해 비율이 50%로 급등 한 다음 process
단계에서 오랫동안 중단됩니다. 요점을 얻으면 사용자 경험을 망치고 매우 오도하는 ETA를 만들 수 있습니다.
이를 개선하려면 그에 따라 단계의 비율을 배포해야합니다! alive_bar
에게 4 단계가 있다고 말했기 때문에 첫 번째 단계가 완료되었을 때 전체 처리의 1/4 또는 25%가 완료된 것으로 이해했습니다 ... 따라서 단계가 얼마나 오래 걸리는 지 측정하고 수동 모드를 사용해야합니다. 각 단계에서 막대 백분율을 올바른 양으로 늘리십시오!
내 다른 오픈 소스 프로젝트를 사용하여 이러한 지속 시간을 쉽게 측정 할 수 있습니다! 더 나은 결과를 얻으려면 일부 대표적인 입력으로 시뮬레이션하십시오. 다음과 같은 것 :
from about_time import about_time
with about_time () as t_total : # this about_time will measure the whole time of the block.
with about_time () as t1 : # the other four will get the relative timings within the whole.
corpus = read_file ( file ) # `about_time` supports several calling conventions, including one-liners.
with about_time () as t2 : # see its documentation for more details.
tokens = tokenize ( corpus )
with about_time () as t3 :
data = process ( tokens )
with about_time () as t4 :
resp = send ( data )
print ( f'percentage1 = { t1 . duration / t_total . duration } ' )
print ( f'percentage2 = { t2 . duration / t_total . duration } ' )
print ( f'percentage3 = { t3 . duration / t_total . duration } ' )
print ( f'percentage4 = { t4 . duration / t_total . duration } ' )
됐어요! 이제 모든 단계의 상대적 타이밍을 알고 원래 코드를 개선하는 데 사용할 수 있습니다! 누적 타이밍을 받고 수동 모드 alive_bar
에 넣으십시오!
예를 들어, 발견 된 타이밍이 10%, 30%, 20%및 40%인 경우 0.1, 0.4, 0.6 및 1.0을 사용합니다 (마지막 것은 항상 1.0이어야합니다).
with alive_bar ( 4 , manual = True ) as bar :
corpus = read_big_file ()
bar ( 0.1 ) # 10%
tokens = tokenize ( corpus )
bar ( 0.4 ) # 30% + 10% from previous steps
data = process ( tokens )
bar ( 0.6 ) # 20% + 40% from previous steps
resp = send ( data )
bar ( 1. ) # always 1. in the last step
그게 다야! 사용자 경험과 ETA는 이제 크게 향상되어야합니다.
예, 스피너 속도를 교정 할 수 있습니다!
alive-progress
Bars는 현재 처리량에 대한 멋진 시각적 피드백을 가지고 있으므로 스피너가 더 빠르거나 느리게 작동함에 따라 실제로 처리가 얼마나 빨리 있는지 확인할 수 있습니다.
이런 일이 일어나려면, 나는 어느 쪽의 속도를 가장 잘 느끼는지 경험적으로 찾기 위해 몇 가지 FPS 곡선을 모아서 구현했습니다.
(대화식 버전 [여기] (https://www.desmos.com/calculator/ema05elsux)))
그래프는 로그 (빨간색), 포물선 (파란색) 및 선형 (녹색) 곡선을 보여줍니다. 쉬운 일이 아니었고, 수십 개의 테스트를했으며, 내가 찾고 있던 속도의 느낌에 정말로 영감을 준 테스트를 찾지 못했습니다. 가장 좋은 것은 로그 인 것처럼 보였지만 적은 숫자로 반응하지 않았습니다. 나는 그 작은 숫자에 대해 약간의 비틀기로 작동하게 할 수 있다는 것을 알고 있으므로 많은 실험을하고 마침내 내가 기대하는 동작을 찾을 때까지 로그 곡선 (점선 주황색)을 조정했습니다! 그것은 전체 스펙트럼에서 수십억에서 수십억에서 가장 좋은 만능 인식 속도 변화를 제공하는 것처럼 보였습니다. 즉, 내가 정착 한 곡선이며 모든 모드와 조건에 사용 된 것입니다. 미래에 그리고 누군가가 유용하다고 생각한다면, 그 곡선은 구성 가능할 수 있습니다.
글쎄, 기본 alive-progress
교정은 경계 모드에서 1,000,000 입니다. 즉, 바가 초당 60 프레임으로 새로 고침하는 데 초당 1 백만 개의 반복이 필요합니다. 수동 부적합 모드에서는 1.0 (100%)입니다. 둘 다 방대한 운영 범위를 가능하게하며 일반적으로 잘 작동합니다.
예를 들어, 동일한 속도로 동일한 코드를 실행하는이 매우 다른 교정이 미치는 영향을 살펴보십시오! 스피너가 사용자에게 전달되는 느낌을 주목하십시오.이 처리가 느리거나 빠르게 진행되고 있습니까? 그리고 스피너가 상쾌 할뿐만 아니라 전체 라인뿐만 아니라 막대 표현과 모든 위젯으로 완성되므로 모든 것이 더 부드럽거나 느려집니다.
따라서 처리가 초당 20 개 항목에 거의 얻지 못하고
alive-progress
부진하다고 생각되면40
보정하여 속도 감각을 높일 수 있으며 Waaaay가 더 빨리 실행될 것입니다. 항상 헤드 룸을 남겨두고 50%에서 100% 사이의 무언가로 교정하는 것이 좋습니다. 그런 다음 거기에서 조정하여 가장 좋아하는 것을 찾으십시오! :)
이 놀라운 alive-progress
애니메이션이 표시를 거부합니까?
Pycharm은 굉장합니다, 나는 그것을 좋아합니다! 그러나 왜 그들이 기본적으로 터미널 에뮬레이션을 비활성화했는지 이해하지 못할 것입니다 ... Pycharm의 출력 콘솔을 사용하는 경우 모든 실행 구성에서이를 활성화하십시오.
File
>New Projects Setup
>Run Configuration Templates
,Python
선택한 후 활성화하여 활성화하므로 이미 작성한 새로운 제품에 이미이 세트가 있습니다.
그 외에도 일부 터미널은 실제 터미널 (예 : Pycharm 및 Jupyter), 쉘 파이프 라인 ( cat file.txt | python program.py
) 또는 백그라운드에서 "비 응력"으로보고합니다. 프로세스 (TTY에 연결되지 않음).
alive-progress
비 인터랙티브 터미널에서 스스로를 찾으면 모든 종류의 애니메이션을 자동으로 비활성화하여 최종 영수증 만 인쇄합니다. 이것은 파이프 라인 출력을 엉망으로 만들고 로그 파일을 수천 개의 alive-progress
새로 고침으로 스팸으로 피하기 위해 만들어집니다.
따라서 안전하다는 것을 알면 모든 영광에서 alive-progress
보도록 강요 할 수 있습니다! 다음은 force_tty
인수입니다.
with alive_bar ( 1000 , force_tty = True ) as bar :
for i in range ( 1000 ):
time . sleep ( .01 )
bar ()
허용되는 값은 다음과 같습니다.
force_tty=True
> 항상 애니메이션을 활성화하고 Jupyter 노트북을 자동화합니다!force_tty=False
> 항상 애니메이션을 비활성화하여 최종 영수증 만 유지합니다.force_tty=None
(기본값) -> 터미널의 tty 상태에 따라 자동 감지 config_handler
사용하여 시스템 전체에서 설정할 수도 있으므로 더 이상 수동으로 전달할 필요가 없습니다.
Pycharm의 콘솔 및 Jupyter 노트북은 크게 계측되어있어 훨씬 더 많은 오버 헤드가 있으므로 결과가 예상만큼 유동적이지 않을 수 있습니다. 또한 Jupyter Notebooks는 ANSI 탈출 코드를 지원하지 않으므로
alive_bar
Line Clear"및 "Clear From Cursor"와 같은 기능을 모방하기 위해 일부 해결 방법을 개발해야했습니다. , 항상 본격적인 터미널을 선호합니다.
alive-progress
의존성이 없었습니다. 이제는 두 가지가 있습니다. 하나는 정시에 (나 자신을 말하면 또 다른 흥미로운 프로젝트), 스피너 편집에 걸리는 시간을 추적하고 인간 친화적 인 표현을 생성하는 데 사용됩니다. 다른 하나는 Grapheme, Grapheme 클러스터 브레이크를 감지하는 Grapheme입니다 (미래와 정확성에 대해 묻는 문제를 열었으며 저자는 모든 새로운 유니 코드 버전에서 프로젝트를 업데이트 할 것을 보장합니다).alive-progress
단일 Python 클래스가 없었습니다! 이제 매우 구체적인 이유 (Callables, Ierator 어댑터 및 alive_bar
위젯의 일부 설명 자)가 몇 가지 있습니다.alive_bar
자체조차도 기능 일뿐입니다! 비록 공정하게 말하면, 그것은 그 자체로 여러 번의 폐쇄를 동적으로 꽂는 기능입니다 (파이썬 함수에는 클래스와 마찬가지로 __dict__
가 있습니까?). alive_bar
터미널 크기가 변경되지만 그에 따라 선을 잘라냅니다).contrib
방법을 사용하여 사용자의 멋진 스피너와 바를 공유 할 수있는 간단한 방법을 사용할 수 있습니다.skipped
항목으로 계산 지원을 재개합니다stdout
대신 stderr
및 기타 파일 사용 지원monitor
, elapsed
, stats
와 같은 위젯 표현을 사용자 정의하십시오
여기에서 완료하십시오.
alive_it
호출의 더 나은 오류 처리, Alive_progress의 중첩 된 사용을 감지하고 더 명확한 오류 메시지를 던지십시오.alive_it
에 주석을 입력skipped
항목으로 새로운 재개 계산 지원, Jupyter의 새로운 max_cols
구성 설정, Stderr를 사용할 때 터미널 크기를 가져 오면 공식적으로 Python 3.11을 지원합니다.sys.stderr
및 기타 파일 사용 지원 sys.stdout
, 속도 추정을 부드럽게하고 현재 실행중인 위젯으로 더 많은 쿼리를 부드럽게합니다. ' 데이터, 구성 오류의 도움말 시스템monitor
, elapsed
및 stats
코어 위젯, 새로운 monitor_end
, elapsed_end
및 stats_end
코어 위젯, CTRL+C에 대한 더 나은 지원으로 조기에 조기에 alive_bar
합니다.click.echo()
지원; 더 빠른 성능; 말단 컬럼의 더 안전한 검출; bar.current
속성처럼 행동합니다. 파이썬 3.6을 제거하십시오.check()
스피너와 바의 도구; 바 및 스피너 엔진이 개선됩니다. 새로운 애니메이션 모드와 함께 및 순차적 인 스피너; 새로운 내장 스피너, 바 및 테마; 테마, 스크롤 보호 및 필터 패턴이있는 동적 쇼 타임; 파일에 대한 로깅 향상; 모양을 사용자 정의하기위한 몇 가지 새로운 구성 옵션; 새로운 반복자 어댑터 alive_it
; time.perf_counter()
고해상도 시계; Python 3.6+가 필요합니다 (그리고 공식적으로 Python 3.9 및 3.10을 지원합니다).bar.current()
메소드; Newlines는 바닐라 Python Repl에 인쇄됩니다. 막대는 창문에서 80 숯으로 잘린다bar.text()
메소드, 위치를 증가시키지 않고 상황 메시지를 언제든지 설정합니다 ( bar()
에서 '텍스트'매개 변수를 더 이상 사용하지 않음); 성능 최적화blank
대신 background
매개 변수를 수용하여 임의로 크기의 문자열을 수용하고 백그라운드에서 고정되어있어 "그 위에"막대를 시뮬레이션합니다.show_spinners
및 show_bars
, 새로운 유틸리티 print_chars
, show_bars
고급 데모를 얻습니다 (다시 시도하십시오!). alive_progress
항상 Python을 따라 잡으려고 노력할 것이므로 버전 2.0부터 EOL에 들어가는 모든 Python 버전에 대한 지원을 중단하겠습니다. 여기에서 그들의 일정을 참조하십시오.
그러나 아직 마이그레이션 할 수 없다고 걱정하지 마십시오. alive_progress
버전은 다년생이므로 자신에게 맞는 것만으로 계속 사용하십시오.
다음 형식의 요구 사항에서 구형 alive_progress
패키지를 설정하는 것이 좋습니다. 이것들은 항상 주어진 버전 이전의 최신 빌드 릴리스를 가져올 것이므로 버그 수정을 해제하면이를 얻을 수 있습니다.
❯ pip install -U " alive_progress<2 "
❯ pip install -U " alive_progress<2.2 "
❯ pip install -U " alive_progress<3.2 "
이 소프트웨어는 MIT 라이센스에 따라 라이센스가 부여됩니다. 전체 라이센스 텍스트는 최상위 배포 디렉토리에 있는 LICENSE 파일을 참조하세요.
오픈 소스 프로젝트를 유지하는 것은 어렵고 시간이 많이 걸리며, 나는 이것에 많은 노력을 기울였습니다.
내 작품에 감사한다면 기부금으로 저를 백업 할 수 있습니다! 감사합니다 ?