konsole: permanenter prompt und gleichzeitig stdout darüber

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

Hallo!

Ich habe ein reines commandline-Programm zum Ziel, welches ständig per stdout irgendwelche Informationen ausspuckt und gleichzeitig einen Prompt zeigt, der Befehle in Form von "command \n" entgegennimmt, die dann vom Programm sofort verarbeitet werden.

Welche ist hier die einfachste Herangehensweise?

Etwas genauere Beschreibung von dem, was ich haben möchte:

- in der Konsole soll die unterste Zeile ständig ein Prompt sein
- Hier kann ich Befehle eintippen und mit Enter abschicken
- das Programm schiebt permanent Informationen in stdout. Dieser Ouput soll in der Konsole über dem Prompt "ganz normal nach oben wachsen" (praktisch wie in einer ganz normalen Konsolenanwendung, nur dass eben alles um den Platz, den der Prompt ganz unten braucht, nach oben verschoben ist)
- der ganz normale scrollback des Terminals, in dem die Anwendung läuft, soll funktionieren und beim hochscrollen den gesamten stdout offenbaren, der ausgegeben wurde

Ich denke, dass ich in jedem Fall mit threads bzw subprocess arbeiten muss; richtig? Für den Prompt habe ich noch keine wirkliche Idee...

Danke im Voraus,

Jan-Philip
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Für die UI würde ich urwid nutzen, sowas ist ziemlich einfach zu realisieren wenn man das Prinzip verstanden hat. Außerdem schreibst du bei urwid die mainloop selbst, von daher solltest du auf threads ohne Probleme verzichten können, subprocess braucht man dafür sowieso nicht.
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

urwid hatte ich schonmal ganz kurz angeschaut und sehe die tolle Lösung noch nicht ganz:

- ich konnte mir anhand der gegebenen Tutorials nicht vorstellen, wo ganz normaler stdout hingeschrieben wird.

- für den Prompt muss ich sicherlich irgendein Widget verwenden. In den Tutorials sieht es so aus, als müsste ich jeden eingegebenen character selbst behandeln. Also auch Backspace, Enter, etc. Am liebsten wäre mir aber eine Funktionalität wie sie raw_input() schon komplett zur Verfügung stellt: Command eingeben, mit Enter abschließen, mit Pfeiltasten im Getippten navigieren und mit Backspace auch mal was löschen können

an urwid-erfahrene Leute: Sind meine obigen Bedenken Quatsch und ich muss nur mal tiefer einblicken?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Texteingaben sind aber mit Sicherheit möglich. Sonst würden Programme wie `nano` ja gar nicht funktionieren. `stdout` kannst du doch über `subprocess` lesen. Willst du ein richtiges Terminal nachbilden (das ist eine Menge Arbeit) oder interessieren dich immer nur die Ausgaben des letzten Befehls?
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

Willst du ein richtiges Terminal nachbilden (das ist eine Menge Arbeit) oder interessieren dich immer nur die Ausgaben des letzten Befehls?
Ich dachte, ich hätte oben einigermaßen anschaulich beschrieben, was ich mag :-) Ich probiers nochmal neu; ausführlicher:

Ganz unten in der Konsole möchte ich einen Prompt haben, darüber soll das stdout des gesamten Programms hochwachsen, am Besten scrollbar über die normale Scrollfunktion des Terminals, in dem das Programm läuft. Dieses stdout kommt
1) von einem Programmteil, der *immer* "im Hintergrund" läuft (praktisch in Schleife)
2) von dem Programmteil, der durch einen eingegebenen Befehl ausgelöst wird (deterministisch)


Beide Ausgaben können sich entweder vermischen oder ich pausiere die Ausgabe des Schleifenteils, bis der deterministische Teil (nach Eingabe eines Befehls) abgeschlossen ist -- aber das ist jetzt erstmal nicht so wichtig.

Ich weiß nicht, ob das "ein Terminal nachbilden" ist. Aber ich denke nicht; mehr Funktionalität als oben beschrieben brauche ich nicht.

Das Programm hat eine Hauptaufgabe (den Schleifenteil): über einen Webservice eine Queue beobachten und daraufhin Entscheidungen zu treffen, basiert auf dem einen oder anderen Parameter. Das Programm soll also z.B. alle 10 Sekunden mal gucken was los ist und in Abhängigkeit gewisser Größen "irgendwas" machen.

der deterministische Teil ist:
Die oben genannten Entscheidungen basieren auf irgendwelchen Größen. z.B. diese soll der Nutzer zur Laufzeit über den gewünschten Prompt mittels irgendwelcher selbst ausgedachter Befehle verändern können. Ich möchte aber über den Prompt nicht nur irgendwelchen Variablen andere Werte zuweisen, sondern auch komplexere Funktionen lostreten.
Texteingaben sind aber mit Sicherheit möglich. Sonst würden Programme wie `nano` ja gar nicht funktionieren.
Ich find ja auch, dass es gehen sollte; nur hab ichs noch nicht gefunden :-) Gibts ne Beziehung zwischen nano und urwid?


Generell denke ich, dass mein "Programmmodell" irgendwie üblich sein sollte, oder :-)? Auf ein laufendes Programm über einen permanenten Prompt mittels selbst definierter Befehle Einfluss nehmen.. die Geschichte mit dem Prompt unten und stdout ganz normal oben drüber habe ich besitmmt auch schonmal gesehen; weiß nur nicht mehr wo.

Könnte mir das cmd modul helfen?
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

gurke111 hat geschrieben:Gibts ne Beziehung zwischen nano und urwid?
Curses.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

gurke111 hat geschrieben:Könnte mir das cmd modul helfen?
Das ist nur subprocess in grün.

Du willst wirklich urwid dafür nutzen. Du nimmt dafür ein Frame, als Body nimmst du eine Listbox um die Ausgabe darzustellen, als Footer verwendest du ein Edit Widget um die Befehle eingeben zu können. Ich würde dir empfehlen von diesem Beispiel auszugehen. Du wirst keine schönere Lösung dafür bekommen aber es ist simpel wenn man das Prinzip verstanden hat.
BlackJack

@DasIch: Das `cmd`-Modul hat mit `subprocess` nichts zu tun. Ich denke Du verwechselst das mit dem `commands`-Modul.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Wieviel eigene Befehle hast du denn?
Vielleicht genügt es ja auch, diese Befehle über Buttons oder ähnliche Interaktionselemente auszuführen?!

Würde die Benutzung deines Programms auf jeden Fall sehr vereinfachen.
gurke111
User
Beiträge: 28
Registriert: Freitag 26. Oktober 2007, 22:55

ice2k3, Du hast prinzipiell Recht. Ich werde nicht viele eigene Befehle haben und könnte mir dann die Interaktion anders überlegen, wenn ich schon urwid nehme.

DasIch, danke für die Erläuterung der Herangehensweise!

Ich baue erstmal die Grundfunktionalität meines Programms auf und habe noch anderen Kram zu schaffen, sodass ich mich erst später um urwid kümmere. Wenn ich mein Konzept (wie oben vorgestellt) mittels Eurer Tipps realisiert habe, melde ich mich hier zurück und stelle es vor ;)

Danke bis hierher für die Hilfestellung!!
Antworten