Ausgabe von zwei Streams in zwei curses "Fenstern"
Servus! Ein Python-Code erzeugt ein langes Display-Log. Ein Progress-Bar, schätzt wie lange der Code noch brauchen wird. Ich möchte nun gerne in einen Text-Terminal zwei "Fenster" haben. In einem läuft das Log vorbei, im anderen wird der Progress-Bar angezeigt. ================================ hier läuft das log hier läuft das log hier läuft das log hier läuft das log -------------------------------- hier sehe ich den Progress-Bar ================================ Mit z.B. Urwid kann man das sicher lösen. Aber gibt es nicht einen einfacheren Weg? Beste Grüße Volker -- ========================================================= inqbus Scientific Computing Dr. Volker Jaenisch Richard-Strauss-Straße 1 +49(08861) 690 474 0 86956 Schongau-West http://www.inqbus.de =========================================================
Moin, Vielleicht kann man das mit ncurses lösen: https://docs.python.org/2/howto/curses.html https://de.m.wikibooks.org/wiki/Python_unter_Linux:_Curses Habe ich selbst noch nicht versucht, aber unter dem zweiten Link ist der Anwendungsfall "mehrere Fenster" beschrieben. Gruß Sven Am 22. März 2017 00:37:52 MEZ schrieb "Dr. Volker Jaenisch" <volker.jaenisch@inqbus.de>:
Servus!
Ein Python-Code erzeugt ein langes Display-Log. Ein Progress-Bar, schätzt wie lange der Code noch brauchen wird.
Ich möchte nun gerne in einen Text-Terminal zwei "Fenster" haben. In einem läuft das Log vorbei, im anderen wird der Progress-Bar angezeigt.
================================
hier läuft das log
hier läuft das log
hier läuft das log
hier läuft das log
-------------------------------- hier sehe ich den Progress-Bar ================================
Mit z.B. Urwid kann man das sicher lösen. Aber gibt es nicht einen einfacheren Weg?
Beste Grüße
Volker
-- ========================================================= inqbus Scientific Computing Dr. Volker Jaenisch Richard-Strauss-Straße 1 +49(08861) 690 474 0 86956 Schongau-West http://www.inqbus.de =========================================================
_______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
-- Von einem Gerät versendet.
On 22 Mar 2017, at 00:37, Dr. Volker Jaenisch <volker.jaenisch@inqbus.de> wrote:
Servus!
Ein Python-Code erzeugt ein langes Display-Log. Ein Progress-Bar, schätzt wie lange der Code noch brauchen wird.
Ich möchte nun gerne in einen Text-Terminal zwei "Fenster" haben. In einem läuft das Log vorbei, im anderen wird der Progress-Bar angezeigt.
[...]
Mit z.B. Urwid kann man das sicher lösen. Aber gibt es nicht einen einfacheren Weg?
Gibt es bestimmt. Mir gefällt tqdm sehr gut. Vielleicht ist das etwas für Dich? https://pypi.python.org/pypi/tqdm Gruß, Dinu
Am 22.03.2017 um 07:52 schrieb Dinu Gherman:
Gibt es bestimmt. Mir gefällt tqdm sehr gut. Vielleicht ist das etwas für Dich?
Das nutzte ich in PyHardlinkBackup [1], weil es unter Linux und Windows funktioniert. Allerdings kann man das nicht an die untere Zeile des Terminals tackern :( Hab aber in PyHardlinkBackup ein ähnliches Problem: Nur die Fortschrittsanzeige reicht mir nicht. Ich möchte gern mehr Informationen anzeigen lassen. Als Kompromiss, der unter Windows und Linus "Funktioniert" gehe ich hin und printe einfach in regelmäßigen Abständen (Standard: jede Minute) einige Zeilen mit einem Zwischenstand. Ist nicht schön, weil der Fortschrittsbalken unterbrochen wird und mit scrollt, aber was besseres hab ich noch nicht gefunden. Wie ich das Implementiert habe, kann man recht einfach sehen, wenn man nach "next_update_print" sucht, hier drin: https://github.com/jedie/PyHardLinkBackup/blob/master/PyHardLinkBackup/phlb/... [1] https://github.com/jedie/PyHardLinkBackup -- Mfg. Jens Diemer ---- http://www.jensdiemer.de
Am 22.03.2017 um 08:57 schrieb Jens <python-de-mailingliste@jensdiemer.de>:
Am 22.03.2017 um 07:52 schrieb Dinu Gherman: Gibt es bestimmt. Mir gefällt tqdm sehr gut. Vielleicht ist das etwas für Dich?
Das nutzte ich in PyHardlinkBackup [1], weil es unter Linux und Windows funktioniert. Allerdings kann man das nicht an die untere Zeile des Terminals tackern :(
Wer tackern (und muxen) will, sollte sich das Python Prompt Toolkit anschauen (mit sehr anschaulichen Code-Beispielen): https://pypi.python.org/pypi/prompt_toolkit https://python-prompt-toolkit.readthedocs.io/en/latest/pages/gallery.html Gruß, Dinu
On 2017-03-22 00:37, Dr. Volker Jaenisch wrote:
Ein Python-Code erzeugt ein langes Display-Log. Ein Progress-Bar, schätzt wie lange der Code noch brauchen wird.
Ich möchte nun gerne in einen Text-Terminal zwei "Fenster" haben. In einem läuft das Log vorbei, im anderen wird der Progress-Bar angezeigt.
Nicht direkt eine Antwort auf die Frage, aber ein Hinweis: Je nachdem, wie lange die Verarbeitung der einzelnen Log-Einträge dauert, könnte es sein, dass die Anzeige der Log-Einträge auf dem Bildschirm die Verarbeitung des Logs erheblich ausbremst. Von daher ist die Verwendung des Fortschritts-Balkens unterm Strich vielleicht die anwenderfreundlichere Methode. Vielleicht wäre eine Fortschrittsanzeige mit mehr Informationen (zum Beispiel Prozentangabe und alle n Log-Zeilen das Datum der Log-Zeile aktualisieren) ein guter Kompromiss. Wenn du das auf eine Zeile bekommst, kannst du diese Anzeige auch recht unkompliziert aktualisieren, indem du mit Rückschritt-Zeichen zum Anfang der Zeile zurückgehst und die neue Anzeige "darüber" schreibst. Das wird vereinfacht, wenn du für die Zeile immer die gleiche Breite sicherstellst, weil du dann nicht berechnen musst, wie weit du "zurücklöschen" musst. Viele Grüße Stefan
Servus Stefan! Danke für die Hinweise. Am 22.03.2017 um 08:15 schrieb Stefan Schwarzer:
Nicht direkt eine Antwort auf die Frage, aber ein Hinweis: Je nachdem, wie lange die Verarbeitung der einzelnen Log-Einträge dauert, könnte es sein, dass die Anzeige der Log-Einträge auf dem Bildschirm die Verarbeitung des Logs erheblich ausbremst. Von daher ist die Verwendung des Fortschritts-Balkens unterm Strich vielleicht die anwenderfreundlichere Methode. Es sind wirklich sehr viele Logzeilen. Einige Millionen. Aber die Laufzeit des Programms beträgt (schon parallelisiert) auch Stunden. Daher fallen ein paar Sekunden/Minuten Gesamt-Rechenzeit die für das Formatieren des Outputs im Terminal draufgehen bedeutungslos. Die Logs sind halt sehr gut um mit einem Blick an der Farbe (Sind Color-Logs) zu sehen wie viel und ob was schief geht.
Ideal wäre daher noch eine Tastatur-Steuerung um das Log anzuhalten und darin zu scrollen. Aber das ist ein nice -to-have. In der Praxis macht man dann eher ein "less -r" auf die Log-Datei. Natürlich kann man auch in einem weiteren Terminal-Fenster "tail -f" laufen lassen und im primären Fenster nur den Fortschritts-Balken. Ich wollte einfach wissen ob jemand diese kombinierte Funktionalität schon mal einfach abgebildet hat.
Vielleicht wäre eine Fortschrittsanzeige mit mehr Informationen (zum Beispiel Prozentangabe und alle n Log-Zeilen das Datum der Log-Zeile aktualisieren) ein guter Kompromiss.
Ich habe jetzt schon tqdm im Einsatz für den Fortschritts-Balken - der funktioniert prima und bietet alles was man sich wünscht. Momentan schreibt der sich ins Log und damit kann man leben. Beste Grüße Volker -- ========================================================= inqbus Scientific Computing Dr. Volker Jaenisch Richard-Strauss-Straße 1 +49(08861) 690 474 0 86956 Schongau-West http://www.inqbus.de =========================================================
On 2017-03-22 13:57, Dr. Volker Jaenisch wrote:
Am 22.03.2017 um 08:15 schrieb Stefan Schwarzer:
Nicht direkt eine Antwort auf die Frage, aber ein Hinweis: Je nachdem, wie lange die Verarbeitung der einzelnen Log-Einträge dauert, könnte es sein, dass die Anzeige der Log-Einträge auf dem Bildschirm die Verarbeitung des Logs erheblich ausbremst. Von daher ist die Verwendung des Fortschritts-Balkens unterm Strich vielleicht die anwenderfreundlichere Methode. Es sind wirklich sehr viele Logzeilen. Einige Millionen. Aber die Laufzeit des Programms beträgt (schon parallelisiert) auch Stunden. Daher fallen ein paar Sekunden/Minuten Gesamt-Rechenzeit die für das Formatieren des Outputs im Terminal draufgehen bedeutungslos.
Was ich meinte, ist, dass die Ausgabe nicht nur ein bisschen zur Gesamtlaufzeit beitragen kann. Unter Umständen dauert die Log-Verarbeitung mit scrollenden Log-Zeilen - zum Beispiel - doppelt so lang. Ich habe schon des öfteren erlebt, dass ein Programm deutlich schneller läuft, wenn man dessen Ausgabe nicht auf den Bildschirm schreiben lässt, sondern in eine Datei umleitet. Du kannst es mal ausprobieren, vom Log-Auswertungs-Programm während der Verarbeitung jede Zeile mit `print` oder `logging`-Calls auszugeben und das mit der Laufzeit nur mit Fortschrittsbalken vergleichen. Wenn du "Glück" hast, dauert die Verarbeitung der einzelnen Log-Zeilen so lange, dass die Ausgabe anteilig tatsächlich nur wenig Unterschied macht. :-) Viele Grüße Stefan
participants (5)
-
Dinu Gherman
-
Dr. Volker Jaenisch
-
Jens
-
Stefan Schwarzer
-
Sven Möller