Konsole hängt, während Python-Script in while(True) Schleife ist -> Lösung ?

  • Hallo, ich habe eine etwas allgemeinere Frage:


    Ich habe auf meinem Raspberry Pi 3B+ ein Python-Script laufen, in dem ich zuallerst in einer Endlosschleife den Status meines Input-Pins abfrage (ich frage nach, ob ein Taster gedrückt wurde).

    Mein Problem war allerdings, dass sobald ich dieses Script mit "python MeinProgramm.py" aufrufe, die Konsole nicht mehr ansprechbar ist, weil ich in der Schleife hänge. Dann habe ich noch versucht, die Schleife rauszunehmen, was unweigerlich darin endet, dass das Programm einmal durchlaufen und dann sofort verlassen wird. Da half dann auch der Interrupt nichts mehr, den ich dann auf eine steigende Flanke bei meinem Input angesetzt habe. (Ich dachte zuerst, dass vielleicht außerhalb des Scripts wieder hineingesprungen wird, wenn ich eine Callback-Funktion habe, die durch meinen Interrupt getriggert wird, aber das ist auch nicht so.)

    Jetzt meine Frage:

    Wie kann ich es machen, dass ich einmalig das python-script "manuell" aufrufe und dann auf "alle Ewigkeit" mein Script, ohne dass die Konsole hängen bleibt, läuft, wenn ich den Button drücke ???

    Ist die Einzige Möglichkeit, einen Thread zu machen, oder würde es z.B. schon reichen, das Script einfach ausführbar zu machen? Bräuchte ich dann unbedingt eine Endlosschleife? :helpnew: LG

  • Manul Nö. ;)

    Warum? Ich hätte Manul zugestimmt, denn es wäre klassisches bash Verhalten.


    Da ich auch gerne Output habe, mache ich folgendes.


    Starten per

    nohup python script.py %> /mnt/ram/script_log.txt &
    wobei /mnt/ram ein ram drive ist um die sd-card zu schonen.

    Ich kann jederzeit den output in Echtzeit verfolgen mit

    tail -f /mnt/ram/script_log.txt

    Das script muss ich aber manuell per

    ps -eaf | grep python

    kill <pid>

    abschießen, das ginge bestimmt noch deutlich eleganter.

    Für den Ansatz braucht es ein sys.stdout.flush() damit zeitnah was ins logfile kommt.

    Aber um auf die Ausgangsfrage zurück zu kommen: Wenn das Programm was tun soll, muss es laufen, aus dem Grund kommst Du auf direktem Weg auch nach Programmstart nicht zur Konsole zurück. Ein sleep() hast Du i.d. Schleife schon drinnen, oder?

    • Official Post

    Ich hätte dem auch zugestimmt, aber mein RPi ist da, wie ich feststellte, anderer Meinung. :cool:


    //Edit

    Hatte ich übersehen...

    das ginge bestimmt noch deutlich eleganter.

    Ja, z.B. so: pkill -SIGTERM -f script.py

  • Das ist nicht RPi- sondern Shell-Spezifisch. In der Bash kann ich das beschriebene Verhalten nachstellen, in der zsh, die ich verwende, allerdings nicht: beim ersten Versuch, die Shell, aus der der Hintergrundprozess gestartet wurde, zu beenden, kommt eine Warnung (zsh: you have running jobs). Beim erneuten Versuch, die Shell zu beenden wird der Prozess (vermutlich mit SIGTERM) und dann auch die Shell beendet.

  • Linus: welches Verhalten meinst bei der Bash? job lebt oder jobt stirbt? Ich habe keinen Pi zur Hand, sonst hätte ich es selbst schnell ausprobiert.

    Vielleicht gehen wir auch von verschiedenen Benutzungsvarianten aus. Ich kann meinen Pi nur per ssh erreichen. Eine Shell stirb bei mir mal ganz schnell, wenn ich den Deckel vom MacBook zuklappe.

  • Hallo,


    @Eraser2220: spricht irgendwas dagegen, dass Skript nicht manuell zu starten, sondern beim Systemstart über eine systemd Service Unit oder als systemd User Unit, wenn du dich anmeldest?


    Ansonsten nutzt du scheinbar noch Python 2, dass ist Ende diesen Jahres EOL. Also solltest du dein Skript auf Python 3 umschreiben.


    Gruß, noisefloor