Rückmeldung eines Konsolenprogramms anzeigen bzw. auswerten

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
JoergZ
User
Beiträge: 5
Registriert: Donnerstag 4. September 2014, 11:28

Ich bin ein Newbie.
Meine allgemeine Fragestellung lautet: Wie bekomme ich eine Rückmeldung eines Terminalprogramms (Linux, Raspbian) in mein Python-Skript zurück, so dass ich die Rückmeldung anzeigen lassen und sonstwie weiterverarbeiten kann. Vorauseilende Zusatzfrage: Ist die Rückmeldung von der Art String oder ein Dict oder eine List oder was?

Der Hintergrund: Ich habe bereits eine kleine grafische Oberfläche gebastelt, die eine vorhandene Playlist mit Internetradio-Adressen für das Linux Programm mpd als Buttons präsentiert. Diese Buttons wiederum werden auf einem 7-Zoll Touchscreen angezeigt und können mit dem Finger bedient werden. Als Bibliotheken benutze ich zur Zeit Tkinter und OS. Das Berühren eines der Buttons löst mit der Methode os.popen() einen Aufruf des mpd-Konsolenclients mpc aus. Beispiel für den fünften Eintrag der Playlist: "mpc -h IP_des_MPD_PLayers play 5". Das funktioniert alles wunderbar.

Was ich nun möchte: Wenn ein Sender gewählt wird, gibt mpc eine Rückmeldug zurück, die unter anderem die Webadresse, den Stationsnamen, das aktuelle Programm und andere (mpd) Parameter enthält. Wenn ich mein kleines Programm aus Terminal heraus starte, sehe ich diese Rückmeldung von mpc im Terminalfenster. Ich möchte diese Rückmeldung jedoch in meinem mit Tkinter gebautem Fenster sehen. Aber offen gestanden: ich finde nicht einmal den Python-Befehl oder Funktion heraus, mit dem ich die Programmeldung von mpc "abfangen" kann, um sie in irgendeine Variable oder ein Objekt zu bekommen.

Falls ich jetzt Tips bekommen sollte a la "nimm doch ARIO oder SONATA" (oder eines der vielen anderen Programme) als Client für mpd: keine Frage - alles brauchbare Programme - für "Normalbildschirme" mit Mausbedienung. Ich brauche eine Lösung für "Grobmotoriker" 8) (so eine Art simuliertes Android) mit Grundfunktionen wie Auswahl eines Programms, lauter/leiser, Radio aus und Fenster schließen, die auf einem Minibildschirm mit bloßen Fingern ohne weitere Hilfsmittel gut zu bedienen sind.
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Wo genau ist das Problem?

Du öffnest ohnehin bereits den MPC per os.popen(), das bedeutet du kannst den Datenstrom, der vom MPC ins sys.stdout geschrieben wird direkt aus der Pipe lesen.
Im Grunde genommen musst du den Output des MPC Prozesses Zeile für Zeile lesen, das ist einfach.

Interessant wird es hier abzuschätzen, wann genau du eine Aktion veranlasst, sprich, wann du "genug" Zeilen gelesen hast und die Daten nun als einen zusammenhängenden "Block von Daten" erkennst und weiterverarbeitest.

Kannst du mal ein Beispiel von mehr als einer dieser "Rückmeldungen" bzw Ausgaben vom MPC aus deinem Terminal posten, damit wir das besser abschätzen können?

EDIT: genau, ab 2.6 soll man kein os.popen() mehr nutzen, sondern subprocess.Popen()
Zuletzt geändert von akis.kapo am Donnerstag 4. September 2014, 12:52, insgesamt 2-mal geändert.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@JoergZ: statt "os.popen" schau Dir "subprocess.Popen" an. Die Rückmeldung ist von der Art File.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Komplizierter wird es natürlich, wenn das ganze *nicht* blockierend ablaufen soll...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Ich würde ja mal ganz grundsätzlich externe Programme in Frage stellen wenn doch beim Projekt auf der Webseite ein Python-Modul als Client-Bibliothek angeboten wird: http://www.musicpd.org/libs/
JoergZ
User
Beiträge: 5
Registriert: Donnerstag 4. September 2014, 11:28

@Alle
Jeder einzelne Beitrag hätte mich weitergebracht. Danke!

@BlackJack
Besonderen Dank für die Verhinderung der Erfindung eines neuen Rades bzw. von Umstandskrämereien! In den Bibliotheken ist ja alles drin, was ich brauche. Hatte ich nicht gefunden, weil nicht danach gesucht. Kann man diesen Thread - falls erforderlich - als erledigt/gelöst markieren?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

JoergZ hat geschrieben:Kann man diesen Thread - falls erforderlich - als erledigt/gelöst markieren?
Das wird bei uns bewusst nicht gemacht - denn es kann immer sein, dass andere User zu dem Thema noch etwas sagen wollen :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
pixewakb
User
Beiträge: 1412
Registriert: Sonntag 24. April 2011, 19:43

Google mal nach Kivy - ich habe damit bislang nicht gearbeitet, aber Tkinter würde ich nur ungern einsetzen, wenn es denn ein Gui sein soll. Persönliche Erfahrung habe ich bislang mit PyQt gesammelt, wobei aktuell PySide wohl für Qt empfohlen wird. Für PyQt war m. E. die Dokumentation oder etwas anderes (noch) besser...
Antworten