[Raspberry Pi] Objekte und Klassen

class Car:
# Klassenvariablen (statisch)     
    name = "Mercedes"
    color = "blau"
 
    def __init__(self, cartype):
# Instanzvariable (self)
        self.cartype = cartype

    def drive(self, sound):
        print("Typ:", self.cartype)
        print("Geräusch:", sound)

# Werte der Klassenvariablen ausgeben
print(Car.name)
print(Car.color)

# Object instanziieren
auto = Car("Kombi")
auto.drive("brumm")

Links

[Raspberry Pi] Enumerator in Python

import enum
 
# Enumerator, wird als Klasse repräsentiert
class Cars(enum.Enum):
    Mercedes = 1
    Audi = 2
    BMW = 3

# Mercedes
print(Cars.Mercedes)
# Representation
print(repr(Cars.Mercedes))
# Type
print(type(Cars.Mercedes))
# Name
print(Cars.Mercedes.name)
# Wert
print(Cars.Mercedes.value)
# 3. Element
print(Cars(3))
# Element 'Mercedes'
print(Cars['Mercedes'])

# enum als Liste ausgeben
for c in Cars:
    print(c)
 
# hashed List mit enum
hli = {}
hli[Cars.Mercedes] = 'gelb'
hli[Cars.Audi] = 'grün'
hli[Cars.BMW] = 'blau'

print(hli[Cars.Mercedes])

[Raspberry Pi] Fmp4streamer: H264-Videostream direkt über den Browser bereitstellen

Auf Github gibt es ein interessantes Projekt, welches einen per V4L2 bereitgestellten Videostream als einen fragmentierten MP4-Stream (H264) bereitstellt. Das Ganze ist in Python geschrieben, lässt sich einfach installieren, braucht wenig CPU und man kann den Stream direkt im Browser anzeigen: Fmp4Streamer

[Raspberry Pi] Verarbeitung von Kommandozeilenparametern

import sys
import getopt

# Beispiel für Kommandozeile: test.py -i inp.py --output out.py -h
n = len(sys.argv)

print("Scriptname:", sys.argv[0])
print("Anz. Parameter:", n)
print("Parameterliste:", str(sys.argv))

for i in range(0, n):
    print("Parameter", i, ":", sys.argv[i])

try:
# ersten Parameter (Scriptname) aus der Liste entfernen
    pars = sys.argv[1:]

# Options und Argumente aus Parameterliste parsen
    opts, args = getopt.getopt(pars, "hi:o:", ["help", "input=", "output="])

# Options durchlaufen
    for arg, val in opts:
        if arg in ("-i", "--input"):
            print("Input:", arg, "Value:", val)
        elif arg in ("-o", "--output"):
            print("Output:", arg, "Value:", val)
        elif arg in ("-h", "--help"):
            print("Help:", arg, "Value:", val)

# Parse-Exception abfagen
except getopt.error as err:
    print (str(err))

Links

[Raspberry Pi] Exception-Handling

import sys
 
try:
# provoziert Division durch 0 --> ArithmeticError
    a = 1/0
    print(a)
except ArithmeticError as err:
# Ausgabe der Exception
    print("Fehler:", err)
# detailliertere Infos
    print("Detail:", sys.exc_info())
else:
# optional: wird nur erreicht, wenn keine Exception
    print("Alles ok.")
finally:
# optional: wird in jedem Fall erreicht
    print("Aufräumen.")

# hier wieder regulärer Programmablauf
print("Normal weiter.")

Links

[Raspberry Pi] Signalhandler für asynchrone Ereignisse verwenden: KeyboardInterrupt für STRG C abfangen

import signal
import sys
import time

# Handler-Methode: Signal für KeyboardInterrupt abfangen
def sigint_handler(signal, frame):
    print ('--> KeyboardInterrupt abgefangen')
#Programm abbrechen, sonst läuft loop weiter
    sys.exit(0)

if __name__=='__main__':
# SignalHandler registrieren: Unterbrechung über die Tastatur (CTRL+C) abfangen
    signal.signal(signal.SIGINT, sigint_handler)
   
    try:
        while True:
            print("--> Loop")
            time.sleep(1)

    except KeyboardInterrupt:
# wird nicht erreicht, da sigint_handler aufgerufen wird
        print("--> KeyboardInterrupt")

    finally:
        print("--> finally")

    print("--> Ende")

Links