Wie verwende ich einen Fortschrittsbalken, wenn mein Skript eine Aufgabe ausführt, die wahrscheinlich einige Zeit in Anspruch nimmt?
Zum Beispiel eine Funktion, deren Ausführung einige Zeit in Anspruch nimmt und die nach Abschluss zurückgegeben True
wird. Wie kann ich während der Ausführung der Funktion einen Fortschrittsbalken anzeigen?
Beachten Sie, dass dies in Echtzeit erfolgen muss, damit ich nicht herausfinden kann, was ich dagegen tun soll. Benötige ich eine thread
dafür? Ich habe keine Ahnung.
Im Moment drucke ich nichts, während die Funktion ausgeführt wird, aber ein Fortschrittsbalken wäre schön. Ich bin auch mehr daran interessiert, wie dies aus Code-Sicht gemacht werden kann.
Antworten:
Es gibt bestimmte Bibliotheken ( wie diese hier ), aber vielleicht würde etwas sehr Einfaches tun:
Hinweis: progressbar2 ist eine Abzweigung von progressbar, die seit Jahren nicht mehr gewartet wurde.
quelle
NameError: name 'xrange' is not defined
Fehler ausgelöst. Vermisse ich ein Modul?xrange
ist Pythons 3range
.print('■', end='', flush=True)
Mit tqdm können Sie Ihren Loops in Sekundenschnelle eine Fortschrittsanzeige hinzufügen:
Außerdem gibt es eine grafische Version von tqdm seit
v2.0.0
(d977a0c
):Aber seien Sie vorsichtig, da a ausgelöst werden
tqdm_gui
kann,TqdmExperimentalWarning: GUI is experimental/alpha
können Sie es mit verwendenwarnings.simplefilter("ignore")
, aber danach werden alle Warnungen in Ihrem Code ignoriert.quelle
__len__
Eigenschaft verfügen, oder der Benutzer muss dastotal
Argument angebentqdm
. Andernfalls funktioniert die Bar, jedoch ohne ETA.from tqdm import tqdm_notebook as tqdm
. Sonst schreibt es nicht in eine Zeile.Die obigen Vorschläge sind ziemlich gut, aber ich denke, die meisten Leute wollen nur eine fertige Lösung ohne Abhängigkeiten von externen Paketen, die aber auch wiederverwendbar ist.
Ich habe die besten Punkte von all dem bekommen und es zusammen mit einem Testfall zu einer Funktion gemacht.
Um es zu verwenden, kopieren Sie einfach die Zeilen unter "def update_progress (progress)", aber nicht das Testskript. Vergessen Sie nicht, sys zu importieren. Rufen Sie dies auf, wenn Sie den Fortschrittsbalken anzeigen oder aktualisieren müssen.
Dies funktioniert, indem das Symbol "\ r" direkt an die Konsole gesendet wird, um den Cursor zurück zum Start zu bewegen. "print" in Python erkennt das obige Symbol für diesen Zweck nicht neu, daher benötigen wir 'sys'
Das Ergebnis des Testskripts zeigt Folgendes (der letzte Fortschrittsbalken wird animiert):
quelle
in range(101)
nicht 100 sagen , der Fortschritt stoppt bei 99% und wird nie angezeigt.Diese Antwort basiert nicht auf externen Paketen . Ich denke auch, dass die meisten Leute nur einen vorgefertigten Code wollen . Der folgende Code kann durch Anpassen an Ihre Bedürfnisse angepasst werden: Balkenfortschrittssymbol
'#'
, Balkensize
, Textprefix
usw.Verwendungszweck:
Ausgabe:
Benötigt keinen zweiten Thread . Einige der oben genannten Lösungen / Pakete erfordern. Ein zweiter Thread kann beispielsweise ein Problem sein
jupyter notebook
.Funktioniert mit jedem iterierbaren Element. Es bedeutet alles,
len()
was verwendet werden kann. Alist
, adict
von irgendetwas zum Beispiel['a', 'b', 'c' ... 'g']
Sie können auch die Ausgabe von Datei auf sich ändernde ändern
sys.stderr
zum Beispielquelle
TypeError: object of type 'generator' has no len()
generators
) müssen Sie es mit einem umschließenlist()
. Gefälltfor i in progressbar(list(your_generator), "Computing: ", 40):
Für eine ähnliche Anwendung (Verfolgen des Fortschritts in einer Schleife) habe ich einfach die Python-Fortschrittsleiste verwendet :
Ihr Beispiel lautet ungefähr so:
quelle
progressbar2
Gründen der Python 3-Kompatibilität das Paket. Der obige Code funktioniert damit.import *
?Versuchen Sie den Fortschritt unter https://pypi.python.org/pypi/progress .
Das Ergebnis ist ein Balken wie der folgende:
quelle
progress
macht schöne Balken, aber es schlägt fehl, wenn andere Software manipuliertstderr
. Entschuldigung, aber ich habe das genaue Problem nicht untersucht.Ich habe gerade eine einfache Fortschrittsklasse für meine Bedürfnisse erstellt, nachdem ich hier nach einer gleichwertigen Lösung gesucht habe. Ich dachte, ich könnte es gut posten.
Beispiel:
Druckt Folgendes:
[======== ] 17/80 ( 21%) 63 to go
quelle
progress.current
Inkrementieren am Ende von hinzufügen__call__
, um die Interaktion mit dem Objekt aus dem Hauptcode noch weiter einzuschränken.Ich mag Brian Khuus Antwort wegen seiner Einfachheit und weil ich keine externen Pakete benötige. Ich habe es ein wenig geändert, also füge ich hier meine Version hinzu:
Es wird die Gesamtzahl der Läufe (
total
) und die Anzahl der bisher verarbeiteten Läufe (progress
) angenommentotal >= progress
. Das Ergebnis sieht folgendermaßen aus:quelle
Sie können tqdm verwenden :
In diesem Beispiel läuft der Fortschrittsbalken 5 Minuten lang und wird folgendermaßen angezeigt:
Sie können es ändern und anpassen, wie Sie möchten.
quelle
Um ein Fortschrittsbalken-Framework auf nützliche Weise zu verwenden, dh um einen tatsächlichen Fortschrittsprozentsatz und eine geschätzte ETA zu erhalten, müssen Sie in der Lage sein, anzugeben, wie viele Schritte es haben wird.
Können Sie Ihre Rechenfunktion in einem anderen Thread in mehrere logische Schritte aufteilen? Können Sie den Code ändern?
Sie müssen es nicht umgestalten oder in tatsächliche Methoden aufteilen, Sie können einfach einige strategische
yield
s an einigen Stellen darin platzieren! Wenn die teure Funktion eine for-Schleife hat , fügen Sie einfach eine ein. Sie sollten erst am Ende wissen, wie viel Ertrag erzielt wird, um die besten Ergebnisse zu erzielen.Auf diese Weise könnte Ihre Funktion ungefähr so aussehen:
oder dieses:
Mit dieser Art von Funktion können Sie Folgendes installieren:
Und benutze es wie:
Um einen coolen Fortschrittsbalken zu bekommen!
Haftungsausschluss: Ich bin der Autor von living_progress, aber es sollte Ihr Problem gut lösen. Lesen Sie die Dokumentation unter https://github.com/rsalmei/alive-progress . Hier ist ein Beispiel dafür, was es kann:
quelle
Ich mag die Python-Fortschrittsleiste sehr , da sie sehr einfach zu bedienen ist.
Für den einfachsten Fall ist es nur:
Das Erscheinungsbild kann angepasst werden und die geschätzte verbleibende Zeit anzeigen. Verwenden Sie für ein Beispiel denselben Code wie oben, jedoch mit:
quelle
Wenn es sich um eine große Schleife mit einer festgelegten Anzahl von Iterationen handelt, die viel Zeit in Anspruch nimmt, können Sie diese von mir erstellte Funktion verwenden. Jede Iteration der Schleife fügt den Fortschritt hinzu. Wenn count die aktuelle Iteration der Schleife ist, ist total der Wert, zu dem Sie eine Schleife ausführen, und size (int) gibt an, wie groß der Balken in Schritten von 10 sein soll, dh (Größe 1 = 10 Zeichen, Größe 2 = 20 Zeichen).
Beispiel:
Ausgabe:
quelle
Verwenden Sie diese Bibliothek:
fish
( GitHub ).Verwendungszweck:
Habe Spaß!
quelle
Der folgende Code ist eine recht allgemeine Lösung und enthält auch eine Schätzung der verstrichenen Zeit und der verbleibenden Zeit. Sie können jedes iterable damit verwenden. Der Fortschrittsbalken hat eine feste Größe von 25 Zeichen, kann jedoch Aktualisierungen in Schritten von 1% mit Voll-, Halb- und Viertelblockzeichen anzeigen. Die Ausgabe sieht folgendermaßen aus:
Code mit Beispiel:
Verbesserungsvorschläge oder andere Kommentare sind willkommen. Prost!
quelle
Ich mag diese Seite .
Beginnt mit einem einfachen Beispiel und wechselt zu einer Multithread-Version. Funktioniert sofort. Keine Pakete von Drittanbietern erforderlich.
Der Code sieht ungefähr so aus:
Oder hier ist ein Beispiel für die Verwendung von Threads, um die sich drehende Ladeleiste auszuführen, während das Programm ausgeführt wird:
quelle
In Python3 ist das ganz einfach:
quelle
Bei der Ausführung in Jupyter-Notebooks funktioniert die Verwendung von normalem tqdm nicht, da die Ausgabe in mehreren Zeilen geschrieben wird. Verwenden Sie stattdessen Folgendes:
quelle
Wenn Ihre Arbeit nicht in messbare Teile zerlegt werden kann, können Sie Ihre Funktion in einem neuen Thread aufrufen und festlegen, wie lange es dauert:
Sie können natürlich die Timing-Genauigkeit nach Bedarf erhöhen.
quelle
Ich mag Gabriels Antwort, aber ich habe sie geändert, um flexibel zu sein. Sie können die Balkenlänge an die Funktion senden und Ihren Fortschrittsbalken mit einer beliebigen Länge abrufen. Und Sie können keinen Fortschrittsbalken mit null oder negativer Länge haben. Sie können diese Funktion auch wie Gabriels Antwort verwenden (siehe Beispiel 2).
Ergebnis:
quelle
Ich habe die
format()
Methode verwendet, um einen Lastbalken zu erstellen. Hier ist meine Lösung:Ausgabe:
quelle
Hier ist eine kurze Lösung, mit der die Ladeleiste programmgesteuert erstellt wird (Sie müssen entscheiden, wie lange Sie möchten).
quelle
Versuchen Sie PyProg. PyProg ist eine Open-Source-Bibliothek für Python, mit der Sie super anpassbare Fortschrittsanzeigen und Balken erstellen können.
Es ist derzeit in Version 1.0.2; Es wird auf Github gehostet und ist auf PyPI verfügbar (Links unten). Es ist kompatibel mit Python 3 & 2 und kann auch mit Qt Console verwendet werden.
Es ist wirklich einfach zu bedienen. Der folgende Code:
wird herstellen:
Ich habe PyProg tatsächlich gemacht, weil ich eine einfache, aber super anpassbare Fortschrittsbalkenbibliothek brauchte. Sie können es einfach installieren mit :
pip install pyprog
.PyProg Github: https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/
quelle
Sie können auch enlighten verwenden . Der Hauptvorteil ist, dass Sie gleichzeitig protokollieren können, ohne Ihren Fortschrittsbalken zu überschreiben.
Es werden auch mehrere Fortschrittsbalken verarbeitet.
quelle
Verwenden Sie die Fortschrittsbibliothek !
Hier ist eine benutzerdefinierte Unterklasse, die ich geschrieben habe, um die ETA / Verstrichenen Zeiten in ein besser lesbares Format zu formatieren:
quelle
Das ist meine einfache Lösung:
quelle
Sie sollten den Fortschrittsbalken mit der jeweiligen Aufgabe verknüpfen (damit er den Fortschritt misst: D). Wenn Sie beispielsweise eine Datei per FTP übertragen, können Sie ftplib anweisen, einen Puffer mit einer bestimmten Größe abzurufen, beispielsweise 128 KB, und dann Ihrem Fortschrittsbalken den Prozentsatz der Dateigröße hinzufügen, den 128 KB darstellen. Wenn Sie die CLI verwenden und Ihre Fortschrittsanzeige 20 Zeichen lang ist, würden Sie ein Zeichen hinzufügen, wenn 1/20 der Datei übertragen wurde.
quelle
@ Massagran: Es funktioniert gut in meinen Programmen. Außerdem müssen wir einen Zähler hinzufügen, um die Schleifenzeiten anzuzeigen. Dieser Zähler spielt als Argument der Methode
update
. Zum Beispiel: Lesen Sie alle Zeilen einer Testdatei und behandeln Sie sie mit etwas. Angenommen, die Funktiondosth()
betrifft nicht die Variablei
.Die Variable
i
steuert den Status vonpbar
über die Methodeupdate
quelle
eine etwas allgemeinere Antwort von jelde015 (Kredit an ihn natürlich)
Zum manuellen Aktualisieren der Ladeleiste sind:
und nennen es:
wird ergeben:
Rufen Sie es einfach mit dem aktuellen
i
Wert auf, wann immer Sie möchten .setzen die
size
als die Anzahl der Zeichen sollte die Bar seinquelle
Ich schätze, ich bin etwas spät dran, aber dies sollte für Leute funktionieren, die mit den aktuellen Versionen von Python 3 arbeiten , da dies "f-Strings" verwendet , wie in Python 3.6 PEP 498 eingeführt :
Code
Beispiel
Ausgabe
quelle
Dies ist eine einfache Möglichkeit, einen Fortschrittsbalken zu erstellen
quelle