LEDs ausschalten bei Skript Ende

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Frank R.
User
Beiträge: 38
Registriert: Montag 23. September 2019, 10:10

Hallo Forum,

ich habe hier ein kleines Problem. Folgendes Skript funktioniert zwar, aber wenn ich es beende, z.B. in Thonny über "Stop/Restart Backend", bleibt der aktuelle Zustand der LEDs aktiv.
Irgendwo muss da doch ein zusätzliches gpio cleanup oder sowas wie leds.off() rein, aber wo?

Code: Alles auswählen

from gpiozero import LEDBoard
from time import sleep

def play_leds(leds):
    leds[0].on()
    sleep(1)
    leds[1].on()
    sleep(1)
    leds[2].on()
    sleep(1)
    leds[3].on()
    sleep(1)
    leds[4].on()
    sleep(1)
    leds[5].on()
    sleep(1)
    leds[6].on()
    sleep(1)
    leds[7].on()
    sleep(1)
    leds[8].on()
    sleep(3)
    leds.off()
    sleep(3)

def main():
    leds = LEDBoard(17, 18, 27, 22, 23, 24, 25, 4, 12)
    while True:
        play_leds(leds)

if __name__ == '__main__':
    main()
Wenn ich das Skript laufen lasse passt alles soweit, die LED werden nacheinander angeschaltet und die Schleife läuft unendlich durch. Allerdings müssen alle LEDs ausgeschaltet werden, wenn ich das Skript beende/anhalte.

Besten Dank für Eure Hilfe :D
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür brauchst Du einen finally-Block:

Code: Alles auswählen

from gpiozero import LEDBoard
from time import sleep

def play_leds(leds):
    for led in lds:
        led.on()
        sleep(1)
    sleep(2)
    leds.off()
    sleep(3)

def main():
    leds = LEDBoard(17, 18, 27, 22, 23, 24, 25, 4, 12)
    try:
        while True:
            play_leds(leds)
    finally:
        leds.off()

if __name__ == '__main__':
    main()
Frank R.
User
Beiträge: 38
Registriert: Montag 23. September 2019, 10:10

Hallo Sirius3,
habe Deinen Code eben getestet, funktioniert leider nicht. Wenn ich das Skript beende bleiben die LEDs nach wie vor aktiviert. Da ist auch ein Tippfehler drin den ich beheben musste, statt "leds" hast Du ein mal "lds" geschrieben.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann macht Dein Thonny böse Sachen, nämlich Programme ohne Grund hart abbrechen.
Frank R.
User
Beiträge: 38
Registriert: Montag 23. September 2019, 10:10

Habe Version 3.2.6 installiert. Raspi heute erst aktualisiert. Bin schon etwas erstaunt, wenn ich das Skript per Strg+C beende, gehen die LEDs tatsächlich aus. Ist das bei Thonny normal, dass ein Klick auf "Stop/Restart Backend" solche Probleme verursacht? Also stimmt Dein Skript so doch.
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man muesste jetzt in Thonny suchen, oder in dessen Code schauen, wie genau das ein Skript ausfuehrt, und was es da ggf. fuer Alternativen gibt. Theoretisch ist es moeglich, die KeyboardInterrupt-Exception abzufangen, und dadurch wuerde das beenden in Thonny nicht mehr gehen. Darum haben die da ggf. einen rabiateren Weg gewaehlt.
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Selbst dann sollte es doch aber noch einen Unterschied zwischen „terminate“ und „kill“ geben.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Auch SIGTERM lässt sich doch abfangen?
Benutzeravatar
__blackjack__
User
Beiträge: 13114
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__deets__: Ja aber das macht deutlich weniger Software, beziehungsweise wenn, dann in der Regel um ordentlich aufzuräumen bevor sie sich beendet. Ich würde „kill“ wirklich nur an Prozesse senden die eine gewisse Zeit nicht mehr reagieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
DeaD_EyE
User
Beiträge: 1021
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Webserver lassen sich z.B. über Signale steuern. Bei Datenbanken ist es z.B. auch wichtig, dass zu ende geschrieben wird, um Inkonsistenzen zu vermeiden.
SIGTERM wäre der richtige Weg und SIGKILL kann man nicht abfangen und ist quasi der letzte Ausweg.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten