Konflikte zwischen os.popen und rawinput

  • Hallo,

    Ich bin gerade dabei das jukebox4kids projekt für meine Tochter zu Weihnachten zu bauen. Kurz vor der Zielgeraden bin ich noch auf ein Problem gestoßen:

    Ich nutze mehrere Threads u.a.

    Ein Thread der auf einem Display Tracknummer, Spieldauer etc. Anzeigt. Dazu ruft ein Thread sekündlich ein os.popen Befehl aus, lässt sich von xmms2 die Werte geben und gibt diese ans Display.

    Ein weiterer Thread überwacht den rfid Kartenleser auf neue Eingaben. Der Kartenleser agiert wie eine usb Tastatur und wird daher über rawinput eingelesen. Getrennt voneinander laufen beide Funktionen super nur parallel nicht.

    Das Python Programm wird automatisch über bashrc gestartet. Die Display Steuerung bekommt keine Werte von xmms2, bzw.wenn ich das Programm mit & im Hintergrund starte geht das Display aber die Eingabe des Kartenlesers wird nicht ausgewertet.

    Seltsamerweise funktionieren os.system Befehle über die ich Start/Stop/weiter realisiere.

    Irgendwie scheint das os.popen und rawinput sich gegenseitig die Shell zu blocken. Kann ich irgendwie 2 verschiedene Shells nutzen? Andere Ideen?

    Vielen Dank und frohe Weihnachten

    Simon

  • Hallo,

    also ohne Code zu sehen ist das alles ein bisschen vage, aber grundsätzlich ist der Befehl `raw_input` "blocking", d.h. die Ausführung des Programms pausiert an der Stelle, wo der Befehl steht. In wie fern sich bei dir Threads gegenseitig blockieren lässt sich mit den aktuellen (dünnen) Infos nicht sagen.

    `os.popen`gilt als veraltet - steht in der Doku von Python sogar wörtlich drin. Du solltest das `subprocess` Modul benutzen.

    Gruß, noisefloor

  • Danke, ich versuchs mal mit 'subprocess'. Den Code habe ich gerade nicht zur Hand, reiche ich heute Abend nach.

    Ich vermute es hat weniger mit den Threads zu tun, sondern wirklich das rawinput irgendwie verhindert, das Rückmeldungen aus der Console ausgelesen werden können.

    Eine Idee die ich noch habe ist, mit > den Output in eine Datei zu leiten und diese dann auszulesen, wobei das nicht sonderlich elegant ist.

  • Hier der vereinfachte Code als Beispiel, hoffe das hilft weiter:

    CheckStatus fragt einfach regelmäßig die aktuelle Spielzeit ab und gibt diese aus.

    readCard wartet darauf, dass der Kartenleser eine ID eingibt und wertet diese aus.

    Die Threads müssen untereinander nicht kommunizieren, sondern nur jeder für sich seine Arbeit erledigen, allerdings parallel.

  • Hallo,

    also ich sehe jetzt gerade nicht, was sich da blockieren sollte...

    Allerdings weiß ich nicht, was bei `raw_input` passiert, wenn du da Skript in den Hintergrund schickst. `raw_input` liest von stdin, nur ist stdin nicht bei Hintergrundprozessen verfügbar. Da musst du dann z.B. über eine Pipe kommunizieren.

    Gibt es keine anderen Weg, als `raw_input`, um Daten vom RFID-Leser zu bekommen?

    Gruß, noisefloor

  • Nachdem ich stundenlang mit Pipes herumexperimentiert habe, habe ich festgestellt, dass das Problem wohl doch woanders lag.

    Ich kann noch nicht ganz nachvollziehen woran es lag, jedenfalls geht es jetzt - Wunderheilung...

    Danke für Eure Hilfe und frohe Weihnachten!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!