Python-Script mit einer Taste starten und stoppen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Morgen zusammen,

    ich fand die Idee toll, mittels der Drück-Zeit, wie lange ein Taster gedrückt wird entweder mein Pythonprogramm zu starten (<4 sek) oder es zu stoppen (>4). Dafür habe ich mich des Skriptes von hier (Reboot / Shutdown PI & Reboot Windows Rechner) entschieden. Dieses soll als unabhäniges Programm direkt beim Start geladen werden und ich könnte dann über meinen Taster mein Programm starten oder stoppen.

    Mein Code sieht im Moment so aus:

    Das tolle, mein Programm startet auch direkt wenn ich unter 4 sek drücke und läuft...und läuft.. :bravo2: ...leider stoppt es aber nicht, wenn ich danach >4 sek drücke bzw. wird nicht "gekilled" ähnlich Strg-C. Den Killbefehl habe ich von hier: https://forum-raspberrypi.de/forum/thread/14857-script-beenden/?highlight=%22kill+-s+SIGINT+$(ps+aux+%7c+grep+-v+grep
    Das Testprogramm sieht so aus und macht nicht viel:


    Meine erste Frage wäre natürlich, mache ich das überhaupt richtig?

    Aber gleichzeitig verstehe ich den Zusatz:

    Code
    if __name__ == "__main__":
    
    
     main()


    vom oben nicht. Muss da mein Code vom Test rein? Wenn nicht, worfür sind diese Zeilen da?

    Danke schon mal für eure Antwort.

    David :danke_ATDE:

    Wenn du nicht irrst, kommst du nicht zu Verstand! (Goehte) :angel:

  • Das ist ja wilder Code ;)
    Ich empfehle dir das Modul ``gpiozero`` anzuschauen.
    https://gpiozero.readthedocs.io/en/stable/api_input.html#button

    ``os.system`` sollte schon lange nicht mehr verwendet werden. Schau dir diesbezüglich das ``subprocess`` Modul an.
    https://docs.python.org/2/library/subprocess.html

    Code
    if __name__ == '__main__':
        main()


    nennt sich "Prevent execution on import".
    Genaue Erklärung in den PEPs (299 ). Und weiter wird dort unter PEP8 (Style Guide for Python Code) beschrieben, wie u.a. Namen (Funktionsnamen, Klassennamen, Variablen) geschrieben werden. Auch hier einen Blick reinwerden.
    https://www.python.org/dev/peps/

    Alle Punkte zusammengefasst, könnte dein Programm so aussehen:

  • Hallo,

    kann das Kompliment mit dem Code nur zurückgeben :lol: . War erst erschrocken, was da alles steht. Nach dem ich deine Links gelesen habe komme ich langsam dran, was du gemacht hast. Jedoch stelle ich mir die Frage, ob ich überhaupt richtig programmiere. Woher weiß man den, welche Sachen abgelöst sind und welche nicht. :blush:

    Bin aber grade nicht zu Hause um den Code auszuprobieren, jedoch sehe ich es richtig, dass ich den Code um folgendes erweitern müsste, wenn der Code im selben Verzeichniss liegt wie test.py?

    Code
    import subprocess
    Code
    print("start_something()")
    subprocess.Popen("test.py")
       else:
           print("stop_somthing()")
    subprocess.Popen.kill("test.py")

    (richtig untereinander eingerückt!)


    Noch zwei weitere Fragen:

    Code
    print(time_during_pushed)
    
    
       compare_time(time_during_pushed)

    Ich dachte immer das ich

    Code
    print(time_during_pushed)
    
    
       return(time_during_pushed)

    schreiben muss? Welche Vorteile hat dein Code, wenn man das so schreibt? Was für einen Wert hätte dann count_time() ?
    Und die andere Frage hat sich grade eledigt. :) Ging um das Lambda...aber das kommt aus der gpiozero.

    :danke_ATDE:
    DAVID

    Wenn du nicht irrst, kommst du nicht zu Verstand! (Goehte) :angel:

  • Also normalerweise schreibt man ein Programm in einer Datei und lässt nichts extern ausführen etc. Wenn das Programm größer werden sollte, dann kann man bedenkenlos Klassen und/oder Funktionen in eine andere Datei schreiben und diese dann im Hauptprogramm importieren bzw. auf diese referenzieren. Das beste Vorgehen ist, dass man ein Stift und ein Blatt nimmt und dann mal aufzeichnet, was man sich vorstellt. Aus deinem ``test.py`` werde ich nicht schlau...


    ``subprocess.Popen`` verlangt eine Liste. Also ``Popen(['sudo', 'python', 'test.py'])``
    Das Einrücken bei dir ist falsch. ``subprocess.Popen`` käme an der stellt, wo ``print("start_something()")`` steht.

    ``count_time()`` zählt die Sekunden ab dem Moment, wenn der Button gedrückt gehalten wird bis zu dem Zeitpunkt, wo er wieder losgelassen wird.
    Der Vorteil ist, dass hier ``gpiozero`` verwendet wird und dieses Modul einem eine Menge Arbeit abnimmt. So wird zB intern gezählt, wie lange ein Button gedrückt wird etc. Das Programm ist auch nur halb so groß/lang wie das im ersten Beitrag.


  • ich fand die Idee toll, mittels der Drück-Zeit, wie lange ein Taster gedrückt wird entweder mein Pythonprogramm zu starten (<4 sek) oder es zu stoppen (>4). Dafür habe ich mich des Skriptes von hier (Reboot / Shutdown PI & Reboot Windows Rechner) entschieden.

    Das war aber nicht Sinn des Scripts :-/
    Mein Script sollte kein anderes Pythonprogramm starten oder stoppen sondern einen Windows Computer neustarten oder herunterfahren. Du zweckendfremdes das Script nun für etwas das man tunlichst vermeiden sollte...

    Normalerweise importiert man ein anderes Python Script und führt dann nur die jeweilige Funktion/Klasse des anderen Scripts aus. Nur in bestimmten Fällen nutzt man 'subprocess' oder 'multiprocessing' usw.

    Guck dir mal bitte folgenden Beitrag an: FAQ => Nützliche Links / Linksammlung => Befehle / andere Scripts ausführen => python #1

  • Hallo,

    ja, das weiß ich. Jedoch hat dieses einfach den Charme gehabt, dass ich später über diesen Taster auch andere Scripte starten könnte. Einfach durch neue Zeiten. Natürlich könnte ich das alles in einem Scripte unterbringen oder es mit def aufrufen, aber ich finde es halt so interessanter und spaßiger. Und darüber lerne ich mehr. :)
    Also nicht böse sein, wenn ich dein Scripte genutz habe. :daumendreh2:

    Wenn du nicht irrst, kommst du nicht zu Verstand! (Goehte) :angel:

Jetzt mitmachen!

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