2017-11-09 2 views
0

Ich möchte ein Python-Skript schreiben, das seinen aktuellen Fortschritt in der letzten Zeile des Terminals anzeigt, ähnlich wie apt (nicht apt-get) verhält. Ich weiß, dass es ANSI-Kontrollsequenzen gibt, um mit dem Terminal zu interagieren, aber das Problem ist, dass ich andere Programme (mit subprocess) aufrufen möchte, die ihre eigene Ausgabe produzieren. Ich möchte nicht, dass diese Programme meine Fortschritte überschreiben.apt-like Fortschritt in der letzten Zeile des Terminals

Es können mehrere Subprozesse gleichzeitig ausgeführt werden. Ich benutze das multithreading Modul und jeder Thread macht etwas Arbeit, dann Anrufe und wartet auf einen Unterprozess, dann macht Aufräumarbeiten. Es macht mir nichts aus, dass die Ausgabe der Unterprozesse gemischt wird, solange die letzte Zeile geschont wird.

Wenn das Programm beendet wird, sollte die letzte Zeile gelöscht werden.

+0

Mögliche Duplikat [? Wie kann ich Ausgang an gleicher Stelle auf der Konsole schreiben] (https://stackoverflow.com/questions/517127/How-Do-Ich-Schreibe-Ausgabe-in-der-gleichen-Stelle-auf-der-Konsole) – jbndlr

+0

Dies ist ein wenig einfacher, wenn Sie die Fortschrittslinie an der Spitze des Terminals haben. Hier ist ein Beispiel, das ich vor einiger Zeit geschrieben habe: https://StackOverflow.com/a/45164619/4014959 Aber auch https://StackOverflow.com/a/37501797/4014959 –

+2

Ich empfehle die ['tqdm'] (https : //github.com/tqdm/tqdm) Bibliothek. Ich glaube, dass es die ganze Funktionalität hat, um zu tun, was Sie fragen. – SethMMorton

Antwort

1

Dank PM 2Ring's comment fand ich alles, was ich brauchte.

Die Steuersequenz "\033[X;Yr" (oder "\x1b[X;Yr") weist das Terminal an, nur die Zeilen X zu Y zu scrollen. Ich habe nicht getestet, was passiert, wenn X != 0, da ich den Scrollback-Puffer beibehalten möchte, wie es ist. \033[r setzt das Terminal zurück, um das gesamte Fenster zu scrollen.

Um dynamisch zu sein, sollten Sie die Höhe des Terminals bestimmen, dann die Anzahl der gewünschten statischen Linien subtrahieren und dann den Scrollbereich entsprechend einstellen.

Um eine verschlüsselte Ausgabe zu vermeiden, sollten Sie nach dem Einstellen des Bildlaufbereichs sicherstellen, dass sich der Cursor nicht in Ihrem statischen Bereich befindet. Zum Beispiel hat Ihr Fenster die Größe [w = 120, h = 40] Zeilen und Sie möchten 2 statische Statuszeilen. Bestimmen Sie die Cursorposition (zB [x = 5, y = 39]) und wenn es innerhalb der letzten zwei Zeilen des Fensters ist, drucken Sie 2 Zeilenumbrüche und positionieren Sie den Cursor dann auf [x = 5, y = (h-2) = 38].

Um den Statusbereich zu aktualisieren, speichern Sie die Cursorposition, verschieben Sie sie in die Statuszeile, löschen Sie die Statuszeile, drucken Sie den Status (ohne abschließende Zeilenumbrüche), stellen Sie die Cursorposition wieder her. Es gibt Escape-Sequenzen zum Speichern und Wiederherstellen der Position. Löschen Sie den Statusbereich, wenn Sie den Bildlaufbereich zurücksetzen.

Hilfreiche Links:

Verwandte Themen