Haben Sie sich jemals gefragt, wo sich Ihre langwierige Bearbeitung befand und wann sie enden würde? Drücken Sie normalerweise mehrmals RETURN
, um sicherzustellen, dass es nicht abstürzt oder die SSH-Verbindung nicht einfriert? Haben Sie schon einmal darüber nachgedacht, dass es großartig wäre, einige Verarbeitungsvorgänge ohne Probleme anhalten zu können, zur Python-Eingabeaufforderung zurückzukehren, um einige Elemente manuell zu reparieren, und sie dann nahtlos fortzusetzen ? Ich habe...
Ich habe diesen neuen Fortschrittsbalken gestartet und über all das nachgedacht, seht euch den lebendigen Fortschritt an! ?
Wir stellen das neueste Konzept in Fortschrittsbalken für Python vor! alive-progress
ist eine Klasse für sich und zeichnet sich durch eine Reihe cooler Funktionen aus. Hier ein paar Highlights:
check()
Tool, mit dem Sie Ihre eigenen Animationen entwerfen können! Sie können sehen, wie die generierten Frames und Animationszyklen aussehen werden, wenn sie auf Ihrem Bildschirm explodiert werden, und sie sogar live sehen, bevor die Installation im alive-progress
läuft! Es ist das coolste Tool der Welt! Lassen Sie Ihrer Kreativität freien Lauf! Diese README-Datei wird ständig weiterentwickelt. Werfen Sie also von Zeit zu Zeit einen umfassenderen Blick darauf ... Möglicherweise finden Sie in anderen Abschnitten tolle neue Details! ?
alive-progress
bar()
-Handler Nach etwa einem Jahr beruhigender Stabilität ist der neue alive-progress
endlich da!
Die wichtigsten Funktionen und Verbesserungen sind:
bar()
mit 0
und sogar -N
aufrufen, um rückwärts zu gehen! Nützlich, wenn Sie in einer Iteration keinen Fortschritt erzielen konnten oder etwas zurücksetzen mussten!Und mehr!
enrich_offset
angeben, der für gedruckte oder protokollierte Nachrichten verwendet werden soll, sodass Sie mit on 1:
beginnen oder dort fortfahren können, wo Sie bei vorherigen Berechnungen aufgehört haben! Ein sehr cooles Update hier! alive-progress
hat nicht nur alles aufpoliert und die Terminalunterstützung verbessert, sondern unterstützt jetzt auch die Wiederaufnahme von Berechnungen!
Wenn Sie große Datensätze oder Dinge verarbeiten, die viel Zeit in Anspruch nehmen, können Sie entweder Stapel verwenden oder Teilergebnisse zwischenspeichern. Wenn es dann stoppt und neu gestartet wird, überspringen Sie am Ende sehr schnell alle bereits erledigten Elemente, wodurch die alive_bar
den Eindruck erweckt, Sie würden Tausende von Elementen pro Sekunde verarbeiten, was wiederum die ETA völlig ruiniert ... Aber nicht mehr ! Sagen Sie bar()
einfach, dass Sie Elemente übersprungen haben...?
Sie können es auf zwei Arten verwenden:
1. Wenn Sie wissen, wo Sie aufgehört haben:
with alive_bar ( 120000 ) as bar :
bar ( 60000 , skipped = True )
for i in range ( 60000 , 120000 ):
# process item
bar ()
Ja, rufen Sie einfach einmal bar(N, skipped=True)
mit der Anzahl der Elemente auf.
2. Wenn Sie es nicht wissen oder die Artikel verstreut sind:
with alive_bar ( 120000 ) as bar :
for i in range ( 120000 ):
if done ( i ):
bar ( skipped = True )
continue
# process item
bar ()
Ja, so einfach ist das! Rufen Sie einfach bar(skipped=True)
auf, wenn ein Element bereits erledigt ist, oder ansonsten wie gewohnt bar()
. Sie könnten am Ende auch einen einzelnen bar(skipped=?)
-Aufruf teilen, mit einem booleschen Wert, der angibt, ob Sie dieses Element übersprungen haben oder nicht. Cool, oder?
Außerdem in dieser Version:
max_cols
-Konfigurationseinstellung, die Anzahl der zu verwendenden Spalten, wenn das Abrufen nicht möglich ist, wie in Jupyter und anderen Plattformen, die die Größe nicht unterstützenJa, ich konnte diese Version endlich herausbringen! Das sind die neuen Goodies:
B
, bytes
oder sogar °C
!sys.stderr
und anderen Dateien anstelle von sys.stdout
!Mit Spannung erwartete Korrekturen:
TypeError: unhashable type: 'types.SimpleNamespace'
mehr.RotatingFileHandler
s! Ja, hier finden Sie Unterstützung.Und zu guter Letzt ein ausgefeilteres Layout, damit Sie Ihre Fortschritte genießen können!
Jetzt unterstützt alive_bar
den Dual-Line- Textmodus!
Wenn Sie jemals längere Situationsnachrichten in die Leiste einfügen wollten, fühlten Sie sich wahrscheinlich in eine Zeile gequetscht. Sie mussten die wunderschön animierte Leiste verkleinern oder, noch schlimmer, Widgets (!) entfernen, um sehen zu können, was Sie brauchten ...
Nicht mehr!! Sie können die Leiste jetzt zweizeilig machen und Text darunter einfügen!
Ja, es gibt eine Meldung unter der gesamten Leiste und alle anderen Druck-/Protokollierungsmeldungen scrollen darüber!
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 ()
Ausgabe:
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...
Außerdem gibt es in alive_it
einen neuen finalize
-Funktionsparameter, mit dem Sie den Titel und/oder Text der endgültigen Quittung festlegen können, sowie eine verbesserte Protokollierungsunterstützung, die benutzerdefinierte Logger erkennt.
Hier dreht sich alles um Individualisierung; Die Kern-Widgets können jetzt geändert werden:
monitor
, elapsed
und stats
, damit diese so aussehen, wie Sie es möchten!Es ist unglaublich, dass diese Zeichenfolgen alle Funktionen des Python-Formats unterstützen, sodass Sie beispielsweise
{percent:.1%}
können.
Sie können auf dem endgültigen Beleg noch weiter angepasst werden!
monitor_end
, elapsed_end
und stats_end
, mit dynamischen Formaten, die von den Standardformaten übernommen wurden!Wenn Sie zuvor einige Widgets ausgeblendet haben, nur damit sie nicht auf dem Beleg erscheinen, können Sie sie jetzt in ihrer ganzen Pracht sehen und nur die Beleg-Widgets ausblenden! Oder umgekehrt?
Eine weitere Ergänzung: alive-progress
stellt jetzt jedes Mal, wenn es angehalten wird, seinen coolen Endbeleg wunderbar dar, auch wenn Sie ihn vorzeitig mit STRG+C drücken! Ich weiß nicht, warum ich nicht schon früher darüber nachgedacht habe ...
Download |██████████████████︎ | (!) 45/100 [45%] in 4.8s (9.43/s)
Und schließlich können Sie STRG+C ganz deaktivieren! Der Standardwert ist der sicherere ctrl_c=True
, wodurch STRG-C wie gewohnt funktioniert.
Deaktivieren Sie es ctrl_c=False
, um die Verwendung Ihrer interaktiven alive_bar
viel reibungsloser zu gestalten (es gibt keine Stack-Traces, wenn Sie sie stoppen) und/oder wenn sie sich auf der obersten Ebene Ihres Programms befindet!
Achtung: Wenn es sich beispielsweise innerhalb einer for-Schleife befindet, wird einfach mit der nächsten Iteration fortgefahren, was möglicherweise das ist, was Sie wollen, aber vielleicht auch nicht ...
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 ()
Ausgabe:
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)
...
Einige wichtige neue Funktionen, die oft gewünscht wurden, sind endlich verfügbar!
click.echo()
-Druck JA! alive-progress
unterstützt jetzt Jupyter-Notebooks und verfügt außerdem über einen deaktivierten Status! Beide waren heiß begehrt und endlich gelandet!
Und noch besser: Ich habe einen automatischen Erkennungsmechanismus für Jupyter-Notebooks implementiert, sodass es sofort funktioniert, ohne dass Änderungen an Ihrem Code erforderlich sind!!
Sehen Sie selbst:
Es scheint sehr gut zu funktionieren, aber im Moment sollte es als experimentell betrachtet werden.
Es gab Fälle, in denen einige visuelle Störungen aufgetreten sind, wie zum Beispiel, dass zwei Aktualisierungenalive_bar
aneinandergereiht und nicht übereinander ausgeführt wurden ... Und das ist etwas, was ich glaube ich unmöglich umgehen kann: Es scheint, dass Jupyter die Leinwand manchmal zu ungewöhnlichen Zeiten aktualisiert. Dadurch gehen einige Daten verloren. Bitte teilen Sie mir die Angelegenheit mit, wenn sich etwas Lustigeres ergibt.
Dies ist ein großer Durchbruch im Bereich alive-progress
!
Ich habe ein Jahr damit verbracht, es zu entwickeln, und ich bin sehr stolz auf das, was ich erreicht habe o/
.check()
-Tools, die alle Frames aus allen Animationszyklen von Spinnern und Balken kompilieren und wunderschön rendern! Sie können sogar vollständige Frame-Daten, interne Codepunkte und sogar ihre Animationen enthalten! ?alive-progress
-Widgets!alive_it
, der ein Iterable akzeptiert und bar()
für Sie aufruft!Da es sich um eine größere Versionsänderung handelt, kann eine direkte Abwärtskompatibilität nicht garantiert werden. Wenn etwas zunächst nicht funktioniert, überprüfen Sie einfach die Signaturen der neuen Importe und Funktionen, und schon kann es losgehen. Alle bisherigen Funktionen sollten hier weiterhin funktionieren! ?
alive-progress
Einfach mit pip installieren:
❯ pip install alive-progress
Wenn Sie sich fragen, welche Stile integriert sind, ist es showtime
! ;)
from alive_progress . styles import showtime
showtime ()
Hinweis: Bitte ignorieren Sie den Pfad im animierten GIF unten, der richtige ist oben. Die Generierung dieser langen GIFs ist sehr zeitaufwändig, sodass ich nicht bei jeder einzelnen Änderung ein weiteres erstellen kann. Vielen Dank für Ihr Verständnis.
Ich habe diese Stile nur erstellt, um alle von mir erstellten Animationsfabriken auszuprobieren, aber ich finde, dass einige davon am Ende sehr, sehr cool waren! Benutzen Sie sie nach Belieben und mischen Sie sie nach Herzenslust!
Möchten Sie die tatsächlichen alive-progress
in Ihrem System sehen, bevor Sie sie selbst ausprobieren?
❯ python -m alive_progress.tools.demo
Cool, oder?? Geben Sie nun eine ipython
REPL ein und versuchen Sie Folgendes:
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 ()
Sie werden so etwas sehen, mit coolen Animationen während des gesamten Prozesses?:
|████████████████████████████████████████| 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)
Schön, oder? Hat es Ihnen gefallen? Ich wusste, dass du es tun würdest, danke?
Um es tatsächlich zu verwenden, schließen Sie einfach Ihre normale Schleife in einen alive_bar
-Kontextmanager wie diesen ein:
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
Und es lebt! ?
Kurz gesagt: Rufen Sie die Elemente wie immer ab, geben Sie den Kontextmanager alive_bar
mit der Anzahl der Elemente ein und iterieren/verarbeiten Sie diese Elemente dann, indem Sie am Ende bar()
aufrufen! So einfach ist das! :) :)
items
können beliebig iterierbar sein, beispielsweise ein Abfragesatz.alive_bar
ist die erwartete Gesamtsumme, wie qs.count()
für Abfragesätze, len(items)
für Iterables mit Länge oder sogar eine statische Zahl;bar()
sorgt dafür, dass die Leiste vorwärts geht – Sie rufen ihn normalerweise in jeder Iteration auf, direkt nach Abschluss eines Elements;bar()
zu oft (oder zu wenig am Ende) aufrufen, stellt der Balken diese Abweichung vom erwarteten total
grafisch dar, sodass Über- und Unterläufe sehr leicht erkennbar sind.bar.current
auf.Sie können kreativ werden! Da der Balken nur vorwärts geht, wenn Sie
bar()
aufrufen, ist er unabhängig von der Schleife ! Sie können damit also alles überwachen, was Sie wollen, wie ausstehende Transaktionen, fehlerhafte Elemente usw., oder es sogar mehr als einmal in derselben Iteration aufrufen! Am Ende erfahren Sie also, wie viele dieser „besonderen“ Ereignisse es gab, einschließlich ihres prozentualen Anteils an der Gesamtzahl!
Während Sie sich in einem alive_bar
-Kontext befinden, können Sie mühelos Nachrichten anzeigen, die eng mit dem aktuell angezeigten Fortschrittsbalken verknüpft sind! Es wird in keiner Weise kaputtgehen und Ihre Botschaft sogar bereichern!
bar.text('message')
und bar.text = 'message'
setzen eine Situationsmeldung direkt in der Leiste, in der Sie etwas über das aktuelle Element oder die Phase, in der sich die Verarbeitung befindet, anzeigen können;bar.title('Title')
und bar.title = 'Title'
geändert werden kann – mischen Sie ihn mit title_length
um zu verhindern, dass sich die Leiste ändert Länge;print()
, bei der alive_bar
die Zeile schön aufräumt, Ihre Nachricht neben der jeweils aktuellen Balkenposition ausgibt und den Balken direkt darunter fortsetzt;logging
, einschließlich Dateiausgaben, wird ebenfalls genau wie das vorherige erweitert.click.echo()
sogar formatierten Text drucken.Großartig, oder? Und all dies funktioniert in einem Terminal oder in einem Jupyter-Notebook genauso!
Sie haben jetzt eine schnellere Möglichkeit, alles zu überwachen! Hier werden die Artikel automatisch für Sie getrackt!
Schauen Sie sich den alive_it
=> den alive_bar
Iterator-Adapter an!
Wickeln Sie Ihre Gegenstände einfach damit ein und legen Sie sie wie gewohnt um!
Die Leiste wird einfach funktionieren; So einfach ist das!
from alive_progress import alive_it
for item in alive_it ( items ): # <<-- wrapped items
print ( item ) # process each item
WIE COOL IST DAS?! ?
Es gelten alle alive_bar
-Parameter, außer total
, was intelligenter ist (wenn es nicht angegeben wird, wird es mithilfe von len
oder length_hint
automatisch aus Ihren Daten abgeleitet) und manual
, was hier keinen Sinn ergibt.
Beachten Sie, dass dort überhaupt kein bar
vorhanden ist. Aber was ist, wenn Sie es doch wollen, z. B. um Textnachrichten zu setzen oder den aktuellen Fortschritt abzurufen?
Sie können mit der internen alive_bar
interagieren, indem Sie alive_it
einfach einer Variablen wie dieser zuweisen:
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!
Beachten Sie, dass es sich hierbei um eine etwas spezielle bar
handelt, die bar()
nicht unterstützt, da der Iterator-Adapter Elemente automatisch für Sie verfolgt. Außerdem unterstützt es finalize
, wodurch Sie den Titel und/oder Text der endgültigen Quittung festlegen können:
alive_it ( items , finalize = lambda bar : bar . text ( 'Success!' ))
...
Kurzgesagt:
- Die vollständige Verwendung erfolgt immer
with alive_bar() as bar
, wobei Siebar()
iterieren und aufrufen, wann immer Sie möchten;- Die Verwendung des Schnelladapters erfolgt
for item in alive_it(items)
, wo Artikel automatisch verfolgt werden;- Die vollständige Verwendung des Adapters ist
bar = alive_it(items)
, wo Sie zusätzlich zur automatischen Verfolgung von Elementen eine spezielle iterierbarebar
erhalten, mit der Sie den innerenalive_progress
nach Ihren Wünschen anpassen können.
Die Standardmodi sind „Auto“ und „Unknown“ , die intern einen Zähler verwenden, um den Fortschritt zu verfolgen. Sie zählen die Anzahl der verarbeiteten Elemente und aktualisieren damit den Fortschrittsbalken entsprechend.
Das total
ist optional. Wenn Sie es angeben, wechselt die Leiste in den automatischen Modus . In diesem Modus wird der Fortschritt des Vorgangs automatisch verfolgt und alle Widgets, alive-progress
zu bieten hat, sind verfügbar: präziser Balken, Spinner, Prozentsatz, Zähler, Durchsatz und ETA.
Wenn Sie keine total
angeben, wechselt die Leiste in den unbekannten Modus . In diesem Modus ist der Fortschritt und damit die voraussichtliche Ankunftszeit nicht bestimmbar, sodass der gesamte Fortschrittsbalken kontinuierlich animiert wird. Die verfügbaren Widgets sind: animierte Leiste, Spinner, Zähler und Durchsatz.
Der coole Spinner läuft völlig unabhängig von der animierten Leiste, beide führen gleichzeitig ihre eigenen Animationen aus und sorgen so für eine einzigartige Show in Ihrem Terminal! ?
Zu guter Letzt verfügt der Auto- Modus über eine einzigartige Funktion: Markieren Sie Elemente als übersprungen, wodurch der Durchsatz und die voraussichtliche Ankunftszeit viel genauer werden! Mehr dazu später.
Der manuelle Modus , der manuell durch das Argument manual=True
aktiviert wird, verwendet intern einen Prozentsatz , um den Fortschritt zu verfolgen. Es ermöglicht Ihnen die vollständige Kontrolle über die Position der Stange. Es wird normalerweise verwendet, um Prozesse zu überwachen, die Ihnen nur einen Prozentsatz der Fertigstellung liefern, oder um zufällige Spezialeffekte zu erzeugen.
Sie können es direkt mit alive_bar
oder über config_handler
verwenden und es ermöglicht Ihnen, Prozentsätze an den bar()
-Handler zu senden! Um beispielsweise eine Fertigstellung von 15 % festzulegen, rufen Sie einfach bar(0.15)
auf – was 15 / 100 entspricht.
Sie können hier auch total
angeben. Wenn Sie dies tun, leitet alive-progress
automatisch einen internen Zähler ab und kann Ihnen somit dieselben Widgets anbieten, die im automatischen Modus verfügbar sind!
Wenn Sie total
nicht angeben, erhalten Sie zumindest grobe Versionen der Durchsatz- und ETA-Widgets, berechnet als „%/s“ (Prozentsatz pro Sekunde) bzw. bis 100 %. Keiner von ihnen ist sehr genau, aber sie sind besser als nichts.
Wenn total
angegeben ist, ist alles cool:
Modus | Schalter | Prozentsatz | Durchsatz | voraussichtliche Ankunftszeit | Über-/Unterlauf |
---|---|---|---|---|---|
Auto | ✅ (Benutzer-Tick) | ✅ (abgeleitet) | ✅ | ✅ | ✅ |
Handbuch | ✅ (abgeleitet) | ✅ (Benutzersatz) | ✅ | ✅ | ✅ |
Wenn dies nicht der Fall ist, müssen einige Kompromisse eingegangen werden:
Modus | Schalter | Prozentsatz | Durchsatz | voraussichtliche Ankunftszeit | Über-/Unterlauf |
---|---|---|---|---|---|
unbekannt | ✅ (Benutzer-Tick) | ✅ | |||
Handbuch | ✅ (Benutzersatz) | ✅ |
Aber es ist eigentlich ganz einfach zu verstehen: Sie müssen nicht darüber nachdenken, welchen Modus Sie verwenden sollen!
total
, wenn Sie ihn haben, und verwenden Sie bei Bedarf manual
!Das ist es! Es wird einfach so gut funktionieren, wie es kann! ? O/
bar()
-Handler Die bar()
-Handler unterstützen je nach Modus entweder relative oder absolute Semantik:
bar()
aufrufen, um den Zähler um eins zu erhöhen, oder einen beliebigen anderen Inkrementwert wie bar(200)
senden, um den Zähler auf einmal um 200 zu erhöhen.Sie unterstützen sogar
bar(0)
undbar(-5)
um sie bei Bedarf zu halten oder zu verringern!
bar(0.35)
aufrufen, damit der Balken sofort auf 35 % Fortschritt springt.In beiden Modi können Sie Ihrer Kreativität freien Lauf lassen! Da Sie die Stange einfach sofort in die gewünschte Position bringen können, können Sie:
- lassen Sie es rückwärts gehen – z. B. um die Zeitüberschreitung von etwas grafisch anzuzeigen;
- Erstellen Sie Spezialeffekte, z. B. um eine Art analoges Echtzeit-Messgerät nachzuahmen.
Sie können bar()
so oft aufrufen, wie Sie möchten! Die Aktualisierungsrate des Terminals wird immer asynchron entsprechend dem aktuellen Durchsatz und Fortschritt berechnet, sodass Sie nicht riskieren, das Terminal mit mehr Aktualisierungen als nötig zu überlasten.
Um den aktuellen Zähler/Prozentsatz abzurufen, rufen Sie in jedem Fall einfach Folgendes auf: bar.current
:
Schließlich nutzt der bar()
-Handler die einzigartige Fähigkeit des automatischen Modus: Rufen Sie einfach bar(skipped=True)
oder bar(N, skipped=True)
auf, um sie zu verwenden. Wenn skipped
auf „ True
gesetzt ist, werden die zugehörigen Elemente von der Durchsatzberechnung ausgeschlossen, wodurch verhindert wird, dass übersprungene Elemente die ETA ungenau beeinflussen.
Die Pflege eines Open-Source-Projekts ist schwierig und zeitaufwändig, und ich habe viel Liebe und Mühe in diese Aufgabe gesteckt.
Wenn Sie meine Arbeit wertgeschätzt haben, können Sie mich mit einer Spende unterstützen! Danke ?
Die showtime
-Ausstellung verfügt über ein optionales Argument, um auszuwählen, welche Show präsentiert werden soll: Show.SPINNERS
(Standard), Show.BARS
oder Show.THEMES
, schauen Sie sich diese an! ;)
from alive_progress . styles import showtime , Show
showtime ( Show . BARS )
showtime ( Show . THEMES )
Hinweis: Bitte ignorieren Sie den Pfad im animierten GIF unten, der richtige ist oben. Die Generierung dieser langen GIFs ist sehr zeitaufwändig, sodass ich nicht bei jeder einzelnen Änderung ein weiteres erstellen kann. Vielen Dank für Ihr Verständnis.
Und das Thema eins (? neu in 2.0):
Die showtime
Ausstellung bietet auch einige Anpassungsoptionen:
Um beispielsweise eine Meeresshow zu erhalten, können Sie showtime(pattern='boat|fish|crab')
:
Sie können diese Shows auch mit den Abkürzungen
show_bars()
,show_spinners()
undshow_themes()
aufrufen!
Es gibt auch ein kleines Dienstprogramm namens
print_chars()
, das dabei hilft, das coole Zeichen zu finden, das Sie in Ihre benutzerdefinierten Spinner und Balken einfügen können, oder um festzustellen, ob Ihr Terminal Unicode-Zeichen unterstützt.
Es gibt mehrere Möglichkeiten, sowohl das Aussehen als auch das Verhalten anzupassen!
Alle können sowohl direkt in der alive_bar
als auch global im config_handler
eingestellt werden!
Dies sind die Optionen – Standardwerte in Klammern:
title
: ein optionaler, immer sichtbarer Balkentitellength
: [ 40
] die Anzahl der Spalten zum Rendern des animierten Fortschrittsbalkensmax_cols
: [ 80
] die maximal zu verwendenden Spalten, wenn es nicht möglich ist, sie abzurufen, wie in Jupyterspinner
: Der Spinner-Stil, der neben der Leiste gerendert werden sollbar
: Der Balkenstil, der in bekannten Modi gerendert werden sollunknown
: Der Balkenstil, der im unbekannten Modus gerendert werden solltheme
: [ 'smooth'
] ein Satz passender Spinner, Balken und Unbekannterforce_tty
: [ None
] erzwingt, dass Animationen ein- oder ausgeschaltet sind oder entsprechend dem TTY (weitere Details hier)file
: [ sys.stdout
] das zu verwendende Dateiobjekt: sys.stdout
, sys.stderr
oder ein ähnlicher TextIOWrapper
disable
: [ False
] Wenn True, werden alle Ausgaben vollständig deaktiviert und keine Hooks installiertmanual
: [ False
] eingestellt, um die Balkenposition manuell zu steuernenrich_print
: [ True
] bereichert print() und protokolliert Nachrichten mit der Balkenpositionenrich_offset
: [ 0
] der Offset, der auf rich_print angewendet werden sollreceipt
: [ True
] druckt die schöne endgültige Quittung, deaktiviert bei Falsereceipt_text
: [ False
] ist so eingestellt, dass die letzte Textnachricht in der endgültigen Quittung wiederholt wirdmonitor
(bool|str): [ True
] konfiguriert das Monitor-Widget 152/200 [76%]
{count}
, {total}
und {percent}
um sie anzupassenelapsed
(bool|str): [ True
] konfiguriert das Widget für die verstrichene Zeit in 12s
{elapsed}
um sie anzupassenstats
(bool|str): [ True
] konfiguriert das Statistik-Widget (123.4/s, eta: 12s)
{rate}
und {eta}
um ihn anzupassenmonitor_end
(bool|str): [ True
] konfiguriert das Monitor-Widget innerhalb des endgültigen Empfangsmonitor
elapsed_end
(bool|str): [ True
] konfiguriert das Widget für die verstrichene Zeit innerhalb des endgültigen Empfangselapsed
stats_end
(bool|str): [ True
] konfiguriert das Statistik-Widget innerhalb des endgültigen Empfangs{rate}
um ihn anzupassen (kein Bezug zu Statistiken)title_length
: [ 0
] legt die Länge der Titel fest, oder 0 für unbegrenztspinner_length
: [ 0
] erzwingt die Spinnerlänge oder 0
für ihre natürliche Längerefresh_secs
: [ 0
] erzwingt die Aktualisierungsperiode auf diesen Wert, 0
ist das reaktive visuelle Feedbackctrl_c
: [ True
] wenn False, wird STRG+C deaktiviert (erfasst es)dual_line
: [ False
] Wenn True, wird der Text unterhalb der Leiste platziertunit
: Jeder Text, der Ihre Entitäten beschriftetscale
: Die Skalierung, die auf Einheiten angewendet werden soll: None
, SI
, IEC
oder SI2
False
oder ''
-> None
, True
-> SI
, 10
oder '10'
-> SI
, 2
oder '2'
-> IEC
precision
: [ 1
] Wie viele Dezimalstellen werden beim Skalieren angezeigt? Und es gibt auch eines, das nur lokal im alive_bar
-Kontext festgelegt werden kann:
calibrate
: Maximaler theoretischer Durchsatz zum Kalibrieren der Animationsgeschwindigkeit (weitere Details hier) Um sie lokal festzulegen, senden Sie sie einfach als Schlüsselwortargumente an alive_bar
:
with alive_bar ( total , title = 'Processing' , length = 20 , bar = 'halloween' ) as bar :
...
Um sie global zu verwenden, senden Sie sie an config_handler
, und jede danach erstellte alive_bar
enthält diese Optionen! Und Sie können sie kombinieren und anpassen, lokale Optionen haben immer Vorrang vor globalen:
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'.
...
Ja, Sie können Ihre eigenen Spinner zusammenbauen! Und es ist ganz einfach!
Ich habe eine Fülle von Spezialeffekten erstellt, die Sie nach Belieben kombinieren können! Es gibt Frames, Scrolling, Bounce, sequentielle, parallele und verzögerte Spinner! Werden Sie kreativ! ?
Die Animationen der Spinner werden durch sehr fortschrittliche Generatorausdrücke entwickelt, tief in mehreren Schichten von Metafabriken, Fabriken und Generatoren?!
alive_bar
als auch an config_handler
senden;Diese Generatoren sind in der Lage, je nach Spinner-Verhalten mehrere unterschiedliche Animationszyklen durchzuführen. Beispielsweise kann ein hüpfender Spinner einen Zyklus ausführen, um ein Motiv sanft in die Szene zu bringen, es dann wiederholt bis zur anderen Seite neu zu positionieren und es dann sanft aus der Szene verschwinden zu lassen = > und das ist alles nur ein Zyklus! Dann kann ein weiterer Zyklus folgen, um alles noch einmal zu machen, aber rückwärts! Und hüpfende Spinner akzeptieren auch unterschiedliche und abwechselnde Muster sowohl in die rechte als auch in die linke Richtung, wodurch sie das kartesische Produkt aller Kombinationen erzeugen und möglicherweise Dutzende verschiedener Zyklen erzeugen, bis sie anfangen, sie zu wiederholen!! ?
Und es gibt noch mehr, ich denke, eine der beeindruckendsten Errungenschaften, die ich in diesem Animationssystem erzielt habe (neben dem Spinner-Compiler selbst) ... Sie liefern nur mehr Animationsframes, bis der aktuelle Zyklus nicht erschöpft ist, dann stoppen sie sich selbst ! Ja, der nächste Zyklus beginnt noch nicht! Dieses Verhalten erzeugt natürliche Unterbrechungen genau an den richtigen Stellen, an denen die Animationen nicht unterbrochen werden, sodass ich problemlos mit jeder anderen Animation verknüpfen kann, die ich möchte!!
Das hat alle möglichen coolen Auswirkungen: Die Zyklen können unterschiedliche Bildzahlen und unterschiedliche Bildschirmlängen haben, sie müssen nicht synchronisiert werden, sie können selbst lange unterschiedliche Sequenzen erstellen, sie können zusammenarbeiten, um Zyklen nacheinander oder nebeneinander abzuspielen, und ich kann Sie in Erstaunen versetzen, indem es mehrere völlig unterschiedliche Animationen gleichzeitig und ohne jegliche Störungen anzeigt!
Es ist fast so, als wären sie... am Leben !! ?
==> Ja, daher kommt der Name dieses Projekts!
Jetzt werden diese Generatoren von Zyklen und Frames vorzeitig vom Spinner-Compiler vollständig verbraucht! Dies ist ein sehr cooler neuer Prozessor, den ich im Rahmen der Cell Architecture- Bemühungen entwickelt habe, damit all diese Animationen auch bei breiten Zeichen oder komplexen Graphem-Clustern funktionieren! Es war sehr schwierig, diese Cluster dazu zu bringen, schrittweise und reibungslos in die Frames ein- und auszusteigen und gleichzeitig zu verhindern, dass sie die Unicode-Kodierung brechen, und vor allem ihre ursprüngliche Länge in allen Frames beizubehalten! Ja, mehrere Zeichen hintereinander können ein völlig anderes Symbol darstellen und können daher niemals geteilt werden! Sie müssen den Rahmen immer gleichzeitig betreten und verlassen, sonst wird das Graphem überhaupt nicht angezeigt (z. B. ein Emoji)!! Geben Sie den Spinner-Compiler ein ......
Das hat einige unglaubliche Dinge möglich gemacht!! Da dieser Compiler zuvor die gesamten Spinner-Frame-Daten generiert:
Ich kann also einfach alle abspielfertigen Animationen sammeln und bin damit fertig, ganz ohne Laufzeitaufwand !! ?
Nachdem die vollständigen Frame-Daten kompiliert und beibehalten wurden, konnte ich außerdem mehrere Befehle erstellen, um diese Daten umzugestalten , z. B. Formen zu ändern, Zeichen zu ersetzen, visuelle Pausen (Frame-Wiederholungen) hinzuzufügen, bei Bedarf Sprungeffekte für beliebige Inhalte zu erzeugen und sogar Zyklen zu transponieren mit Rahmen!!
Doch wie erkennt man diese Effekte? Sieht der von Ihnen erstellte Effekt gut aus? Oder funktioniert es nicht so, wie Sie gedacht haben? JA, jetzt können Sie alle generierten Zyklen und Frames analytisch sehen, in einer sehr schönen Darstellung!!
Ich liebe, was ich hier erreicht check
?
Es ist großartig, wenn ich es selbst sage, nicht wahr? Und auf eine sehr komplexe Software, auf die ich stolz bin, schauen Sie sich seinen Code an, wenn Sie möchten.
Und das check
-Tool ist viel leistungsfähiger! Zum Beispiel können Sie die Codepoints der Frames sehen !!! Und vielleicht haben Sie einen Blick darauf, warum diese Version so, so sehr schwer und komplex war, ...
In Rot sehen Sie die Graphem -Cluster, die ein oder zwei "logische Positionen" einnehmen, unabhängig von ihren tatsächlichen Größen ... Dies sind die "Zellen" der neuen Zellarchitektur ...
Schauen Sie, wie großartig eine Emoji -Flagge dargestellt wird:
Die Flagge scheint sich so reibungslos zu bewegen, weil sie "Halbarakterien" verwendet! Da es sich um ein breites Verkoppelung handelt, weiß alive-progress
, dass er mit "zwei sichtbaren Chars" gerendert wird, und die Animationen berücksichtigen dies, aber mit Räumen komponieren, die nur einen belegen. Wenn man gemischte Hintergründe verwendet, ist die Situation viel komplexer ...
Die Arten von Fabriken, die ich erstellt habe, sind:
frames
: Zeichnet jede Sequenz von Zeichen nach Belieben, die nach Rahmen nacheinander gespielt werden.scrolling
: Erzeugt einen glatten Fluss von einer Seite zur anderen, versteckt sich hinter sich oder wickelt sich auf unsichtbare Grenzen ein - ermöglicht die Verwendung von Probanden einzeln und erzeugt mehrere Zyklen verschiedener Zeichen.bouncing
: Ähnlich wie scrolling
, aber die Animationen zum Start zurückspringen und sich hinter unsichtbaren Grenzen verstecken oder sofort abprallen.sequential
erhalten Sie eine Handvoll Fabriken und spielen Sie sie nacheinander nacheinander! ermöglicht es, sie zu vermischen oder nicht;alongside
einer Handvoll Fabriken zusammen und spielen Sie sie gleichzeitig, warum wählen Sie, wann Sie sie alle haben können?! Ermöglicht die Auswahl des Drehpunkts der Animation;delayed
: Holen Sie sich eine andere Fabrik und kopieren Sie es mehrmals, wobei Sie zunehmend einige Frames auf jedes einzeln überspringen! Hier werden sehr coole Effekte erzielt!Weitere Informationen finden Sie in ihren Dokstrings, die sehr vollständig sind.
Das Anpassen von Balken ist bei weitem nicht so. Nehmen wir an, sie sind "sofort", passive Objekte. Sie unterstützen keine Animationen, dh sie werden bei den gleichen Parametern immer die gleiche Wiedergabe erzeugen. Denken Sie daran, Spinner sind unendliche Generatoren, die lange und komplexe Sequenzen erzeugen können.
Nun, Bars haben auch eine Meta -Fabrik, verwenden Schließungen, um die Stylingparameter zu speichern und zusätzliche Betriebsparameter zu erhalten. Anschließend kann die tatsächliche Fabrik keine Inhalte für sich generieren. Es benötigt immer noch einen zusätzlichen Parameter, eine schwimmende Punktzahl zwischen 0 und 1, was der Prozentsatz ist, um sich selbst zu rendern.
alive_bar
berechnet diesen Prozentsatz automatisch basierend auf dem Zähler und insgesamt, aber Sie können ihn selbst immanual
Modus selbst senden!
Bars haben auch keinen Bar -Compiler, aber sie bieten das Schecktool ! ?
Sie können sogar wie bei Spinnern sogar Wege und normale Chars mischen und kombinieren! (Und alles ist vollkommen ausgerichtet?)
Verwenden Sie die Check -Tools nach Herzenslust !! Sie haben noch mehr Leckereien, die Sie erwarten, sogar Echtzeitanimationen!
Erstellen Sie die wildesten und coolsten Animationen, die Sie können, und senden Sie sie mir!
Ich denke darüber nach, eine Artcontrib
mit benutzerfreundlichen Spinnern und Bars zu erstellen!
Wow, wenn Sie bis hier alles gelesen haben, sollten Sie jetzt ein solides Wissen über die Verwendung von alive-progress
haben! ?
Aber mach dich vor, weil es noch mehr, aufregende Zeug gibt, die vor uns liegen!
Die Aufrechterhaltung eines Open-Source-Projekts ist hart und zeitaufwändig, und ich habe viel ❤️ und Anstrengungen in diese Weise gesteckt.
Wenn Sie meine Arbeit geschätzt haben, können Sie mich mit einer Spende unterstützen! Danke ?
Oh, du willst es insgesamt pausieren, höre ich? Dies ist ein erstaunliches neuartiges Konzept, das Afaik nirgendwo gefunden hat.
Damit können Sie nach Belieben einige Gegenstände manuell reagieren, direkt mitten in einer laufenden Verarbeitung !!
Ja, Sie können zur Eingabeaufforderung zurückkehren und reparieren, ändern, Dinge einreichen, und die Bar "erinnert" nur ", wo es war ...
Angenommen, Sie müssen Zahlungsgeschäfte in Einklang bringen (war dort, das erledigt wurde). Sie müssen über Tausende von ihnen iterieren, die fehlerhaften irgendwie erkennen und sie reparieren. Diese Korrektur ist weder einfach noch deterministisch. Sie müssen jeden untersuchen, um zu verstehen, was zu tun ist. Sie könnten einen Empfänger vermissen oder die falsche Menge haben oder nicht mit dem Server usw. synchronisiert werden. Es ist schwierig, sich alle Möglichkeiten vorzustellen.
Normalerweise müssten Sie den Erkennungsprozess bis zur Fertigstellung ausführen lassen, wobei Sie jede Inkonsistenz, die sie findet, und das Warten, möglicherweise eine lange Zeit, anhängen, bis Sie endlich mit der Behebung beginnen können ... Sie können dies natürlich durch Verarbeitung in den Teilen mildern können oder drucken sie und handeln über eine andere Hülle usw., aber diese haben ihre eigenen Mängel ...?
Jetzt gibt es einen besseren Weg! Pause einfach den tatsächlichen Erkennungsprozess für eine Weile! Dann muss man nur warten, bis der nächste Fehler gefunden wird, und in naher Echtzeit handeln!
Um den Pause -Mechanismus zu verwenden, müssen Sie nur eine Funktion schreiben, damit der Code die Elemente yield
kann, mit denen Sie interagieren möchten. Sie verwenden höchstwahrscheinlich bereits einen in Ihrem Code, aber in der ipython
-Shell oder einer anderen Reply tun Sie es wahrscheinlich nicht. Wickeln Sie also einfach Ihren Debug -Code in eine Funktion ein und geben Sie dann in einen bar.pause()
-Kontext ein!
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 ()
Das ist es! So einfach ist das! O/
Führen Sie nun gen = reconcile_transactions()
aus, um den Generator zu instanziieren, und wenn Sie die nächste fehlerhafte Transaktion wünschen, rufen Sie einfach next(gen, None)
! Ich liebe es ...
Die alive-progress
Stange beginnt wie gewohnt, aber sobald jede Inkonsistenz gefunden wird, wird sich die Stange selbst innehalten, den Refresh-Faden ausschalten und sich an den genauen Zustand erinnern und die Transaktion Ihnen direkt auf der Eingabeaufforderung an Sie ergeben! Es ist fast magisch! ?
In [11]: gen = reconcile_transactions()
In [12]: next(gen, None)
|█████████████████████ | 105/200 [52%] in 5s (18.8/s, eta: 4s)
Out[12]: Transaction<#123>
Sie können dann die Transaktion mit der üblichen _
von ipython
untersuchen (oder sie einfach direkt mit t = next(gen, None)
zuweisen), und Sie sind alle so eingestellt, dass Sie sie beheben!
Wenn Sie fertig sind, reaktivieren Sie einfach die Stange mit dem gleichen next
Anruf wie zuvor !! Die Bar taucht wieder auf, schaltet alles wieder ein und geht weiter, als hätte sie nie aufgehört !! OK, es ist Magie?
In [21]: next(gen, None)
|█████████████████████ | ▁▃▅ 106/200 [52%] in 5s (18.8/s, eta: 4s)
Spülen und wiederholen Sie, bis die endgültige Quittung erscheint, und es wird keine fehlerhaften Transaktionen mehr geben. ?
Sie müssen also einen festen Betrieb ohne Schleifen überwachen, oder?
Es wird sicher funktionieren! Hier ist ein naives Beispiel (wir werden es in einem Moment besser machen):
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`
Es ist naiv, weil es annimmt, dass alle Schritte die gleiche Zeit in Anspruch nehmen, aber tatsächlich kann jeder eine ganz andere Zeit in Anspruch nehmen. Denken Sie daran, dass read_file
und tokenize
möglicherweise extrem schnell sein können, was den Prozentsatz in Höhe von 50%in Höhe von 50%erhöht, und dann im process
für eine lange Zeit anhalten ... Sie erhalten den Punkt, es kann die Benutzererfahrung ruinieren und eine sehr irreführende ETA schaffen.
Um dies zu verbessern, müssen Sie die Prozentsätze der Schritte entsprechend verteilen! Da Sie alive_bar
mitgeteilt haben, gab es vier Schritte, als der erste abgeschlossen war , verstanden es 1/4 oder 25% der gesamten Verarbeitung Erhöhen Sie bei jedem Schritt den Barprozentsatz um den richtigen Betrag!
Sie können mein anderes Open-Source-Projekt über die Zeit verwenden, um diese Dauer einfach zu messen! Versuchen Sie einfach, mit einigen repräsentativen Eingaben zu simulieren, um bessere Ergebnisse zu erzielen. So etwas wie:
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 } ' )
Laust du! Jetzt kennen Sie die relativen Timings aller Schritte und können sie verwenden, um Ihren ursprünglichen Code zu verbessern! Holen Sie sich einfach die kumulativen Timings und legen Sie sie in einen manuellen Modus alive_bar
!
Wenn die von Ihnen festgestellten Timings beispielsweise 10%, 30%, 20%und 40%betrug, würden Sie 0,1, 0,4, 0,6 und 1,0 verwenden (der letzte sollte immer 1,0 sein):
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
Das ist es! Die Benutzererfahrung und die ETA sollten jetzt erheblich verbessert werden.
Ja, Sie können die Spinnergeschwindigkeit kalibrieren!
Die alive-progress
Riegel haben ein cooles visuelles Feedback des aktuellen Durchsatzes, sodass Sie tatsächlich sehen können, wie schnell Ihre Verarbeitung ist, da der Spinner schneller oder langsamer damit läuft.
Damit dies geschieht, habe ich ein paar FPS -Kurven zusammengestellt und implementiert, um empirisch zu finden, welches das beste Geschwindigkeitsgefühl verlieh:
(Interaktive Version [hier] (https://www.desmos.com/calculator/ema05elsux))
Die Grafik zeigt die logarithmischen (rot), parabolischen (blauen) und linearen (grünen) Kurven, mit denen ich begonnen habe. Es war keine leichte Aufgabe, ich habe Dutzende von Tests gemacht und nie eine gefunden, die dieses Geschwindigkeitsgefühl wirklich inspiriert habe, nach dem ich gesucht habe. Das Beste schien der logarithmische zu sein, aber es reagierte schlecht mit kleinen Zahlen. Ich weiß, dass ich es mit ein paar Wendungen für diese kleinen Zahlen zum Laufen bringen könnte, also habe ich viel experimentiert und die logarithmische Kurve (gepunktet orange) angepasst, bis ich endlich das Verhalten fand, das ich erwartet hatte! Es ist diejenige, die die besten Allround-Geschwindigkeitsänderungen im gesamten Spektrum von einigen bis zu Milliarden zu bieten schien ... das ist die Kurve, mit der ich mich begabt habe, und es ist die, die in allen Modi und Bedingungen verwendet wird. In Zukunft und wenn jemand es nützlich finden würde, könnte diese Kurve konfigurierbar sein.
Nun, die Standardkalibrierung des Standard alive-progress
beträgt 1.000.000 in begrenzten Modi, dh 1 Million Iterationen pro Sekunde dauert die Stange, um sich mit 60 Bildern pro Sekunde zu aktualisieren. Im Handbuch unbegrenzter Modus beträgt es 1,0 (100%). Beide ermöglichen einen riesigen Betriebsbereich und funktionieren im Allgemeinen recht gut.
Schauen Sie sich beispielsweise den Effekt an, den diese sehr unterschiedlichen Kalibrierungen haben und denselben Code mit gleicher Geschwindigkeit ausführen! Beachten Sie, dass das Gefühl, dass der Spinner an den Benutzer übergeht. Läuft diese Verarbeitung langsam oder schnell? Und denken Sie daran, dass dies nicht nur der Spinner erfrischt, sondern auch die ganze Linie mit der Rendition der Bar und allen Widgets, also wird alles glatter oder träge:
Wenn Ihre Verarbeitung also kaum 20 Elemente pro Sekunde erreicht und der Meinung ist,
alive-progress
träge ist, können Sie dieses Geschwindigkeitsgefühl erhöhen, indem Sie sie kalibrieren, um40
zu sagen, und es wird Waaaay schneller laufen ... es ist Besser immer etwas Kopffreiheit und kalibrieren Sie es auf etwas zwischen 50% und 100% mehr und optimieren Sie es dann von dort, um die zu finden, die Sie am meisten mögen! :) :)
Weigerten sich diese erstaunlichen Animationen alive-progress
aus?
Pycharm ist großartig, ich liebe es! Aber ich werde nie verstehen, warum sie standardmäßig ein Terminal deaktiviert haben ... Wenn Sie die Ausgangskonsole von Pycharm verwenden, aktivieren Sie dies bitte für alle Ihre Auslaufkonfigurationen:
Ich empfehle sogar, dass Sie in
File
>New Projects Setup
>Run Configuration Templates
,Python
auswählen und dort auch aktivieren, sodass alle neuen, die Sie erstellen, dieses Set bereits haben.
Darüber hinaus melden sich einige Terminals als "nicht interaktiv", wie beispielsweise in der Shell-Pipelines ( cat file.txt | python program.py
) oder im Hintergrund, wenn sie aus einem realen Terminal (Pycharm und Jupyter) oder im Hintergrund ausgehen. Prozesse (nicht mit einem TTY verbunden).
Wenn sich alive-progress
in einem nicht-interaktiven Terminal befindet, deaktiviert es automatisch alle Arten von Animationen und druckt nur die endgültige Quittung. Dies erfolgt, um zu vermeiden, dass sowohl die Pipelineausgabe durcheinander gebracht als auch Ihre Protokolldatei mit Tausenden von Aktualisierungen alive-progress
spammen.
Wenn Sie also wissen, dass es sicher ist, können Sie sie zwingen, alive-progress
in all seiner Ruhm zu sehen! Hier ist das Argument force_tty
:
with alive_bar ( 1000 , force_tty = True ) as bar :
for i in range ( 1000 ):
time . sleep ( .01 )
bar ()
Die akzeptierten Werte sind:
force_tty=True
-> Aktiviert immer Animationen und kennzeichnet automatische Jupyter -Notizbücher!force_tty=False
-> deaktiviert immer Animationen und behalten nur die endgültige Quittung beiforce_tty=None
(Standard) -> automatische Erkennung gemäß dem TTY -Zustand des Terminals Sie können es auch systemweit mit config_handler
festlegen, damit Sie es nicht mehr manuell übergeben müssen.
Beachten Sie, dass die Konsolen- und Jupyter -Notizbücher von Pycharm stark instrumentiert sind und somit viel mehr Overhead haben, sodass das Ergebnis möglicherweise nicht so flüssig ist, wie Sie es erwarten würden. Darüber hinaus unterstützen Jupyter -Notizbücher Ansi Escape -Codes nicht, daher musste ich einige Problemumgehungen entwickeln, um Funktionen wie "Löschen der Linie" und "Clear From Cursor" zu emulieren ... um die flüssigen und glatten
alive_bar
Animationen zu sehen, wie ich es beabsichtigte Bevorzugen Sie immer ein vollwertiges Terminal.
alive-progress
keine Abhängigkeit. Jetzt hat es zwei: Eine ist ungefähr Zeit (ein weiteres interessantes Projekt von mir, wenn ich es selbst sage), mit dem die Zeit für die Spinner-Kompilierung nachverfolgt und seine menschenfreundlichen Wiederholungen generiert werden. Das andere ist Graphem, um Graphem -Cluster -Pausen zu erkennen (ich habe dort ein Problem eröffnet, das nach der Zukunft und der Korrektheit von IT gefragt wurde, und der Autor garantiert, dass er beabsichtigt, das Projekt auf jeder neuen Unicode -Version zu aktualisieren).alive-progress
keine einzige Python-Klasse! Jetzt gibt es ein paar winzige Aussagen aus ganz bestimmten Gründen (Qualienwechsel, Iteratoradapter und einige Deskriptoren für die Widgets alive_bar
).alive_bar
selbst ist nur eine Funktion! Um fair zu sein, ist es "nur" eine Funktion, in der ich mehrere Schließungen von in sich selbst dynamisch anschließe (denken Sie daran, dass Python -Funktionen ein __dict__
haben, genau wie der Klassen?). alive_bar
kostet terminale Größenänderungen, schneidet die Linie jedoch entsprechend ab).contrib
, um eine einfache Möglichkeit zu ermöglichen, coole Spinner und Bars von Benutzern zu teilen.skipped
Elementenstderr
und anderen Dateien anstelle von stdout
monitor
, elapsed
, stats
Hier vollständig.
alive_it
-Aufrufen, Erkennen verschachtelter Verwendungszwecke von Alive_Progress und werfen Sie eine klarere Fehlermeldung ausalive_it
eingebenskipped
Elementen, neue max_cols
-Konfigurationseinstellungen für Jupyter, Fix, das die Größe des Terminals bei der Verwendung von STDERR abzurufen. Offiziell unterstützt Python 3.11 offiziellsys.stderr
und anderen Dateien anstelle von sys.stdout
unterstützt, die Ratenschätzung, mehr Abfragen in die derzeit ausgeführten Widgets. Daten, Hilfesystem bei Konfigurationsfehlernmonitor
, elapsed
und stats
-Kern -Widgets, New monitor_end
, elapsed_end
und stats_end
CORE Widgets, bessere Unterstützung für Strg+C, wodurch das Vorzeit alive_bar
gestoppt wirdclick.echo()
Unterstützung; schnellere Leistung; Sicherere Erkennung von Klemmensäulen; bar.current
wirkt wie ein Eigentum; Python 3.6 entfernen.check()
Tools sowohl in Spinnern als auch in Bars; Bars und Spinner -Motoren überarbeiten; neue Animationsmodi neben und sequentiellen Spinnern; neue gebaute Spinner, Bars und Themen; Dynamische Showtime mit Themen, Bildlaufschutz und Filtermustern; verbesserte Protokollierung für Dateien; Mehrere neue Konfigurationsoptionen zum Anpassen des Erscheinungsbilds; neuer Iteratoradapter alive_it
; verwendet time.perf_counter()
hochauflösende Uhr; Benötigt Python 3.6+ (und unterstützt offiziell Python 3.9 und 3.10)bar.current()
Methode; Newlines werden auf Vanilla Python Reply gedruckt. Die Bar ist auf 80 Zeichen unter Windows abgeschnittenbar.text()
Methode, um Situationsnachrichten jederzeit festzulegen, ohne die Position zu inkrementieren (veraltet "Text" -Parameter in bar()
); Leistungsoptimierungenbackground
anstelle von blank
, der für willkürlich große Zeichenfolgen annimmt und im Hintergrund festgelegt bleibt, wodurch ein Balken "darüber" simuliert wird.show_spinners
und show_bars
, neue Utility print_chars
, show_bars
erhalten einige fortgeschrittene Demonstrationen (probieren Sie es erneut!) alive_progress
wird immer versuchen, mit Python Schritt zu halten. Ausgehend von Version 2.0 werde ich die Unterstützung für alle Python -Versionen fallen, die EOL eingeben. Sehen Sie hier ihren Zeitplan.
Aber mach dir keine Sorgen, wenn du noch nicht migrieren kannst: alive_progress
-Versionen sind mehrjährig. Verwenden Sie also einfach die für Sie funktioniert und Sie sind gut.
Ich empfehle nur dringend, ältere alive_progress
-Pakete in einer Datei "Anforderungen.txt" mit den folgenden Formaten festzulegen. Diese werden immer die neuesten Build -Veröffentlichungen vor einer bestimmten Version abrufen. Wenn ich also Fehlerbehebungen veröffentlichen, erhalten Sie sie auch.
❯ pip install -U " alive_progress<2 "
❯ pip install -U " alive_progress<2.2 "
❯ pip install -U " alive_progress<3.2 "
Diese Software ist unter der MIT -Lizenz lizenziert. Den vollständigen Lizenztext finden Sie in der Datei LICENSE im obersten Distributionsverzeichnis.
Die Aufrechterhaltung eines Open-Source-Projekts ist hart und zeitaufwändig, und ich habe viel ❤️ und Anstrengungen in diese Weise gesteckt.
Wenn Sie meine Arbeit geschätzt haben, können Sie mich mit einer Spende unterstützen! Danke ?