Autostart eines Python Scriptes

  • Hallo,

    ich möchte per Autostart mit bashrc ein Python Skript ausführen. Dieses soll einen LED Streifen sowie einen Magic Mirror ansteuern. Habe in meiner home/pi/.bashrc datei folgendes hinzugefügt:

    Code
    echo Running at boot 
    sudo python /home/pi/Desktop/Autostart.py


    Nach dem reboot steht in der Console:


    Python
    Traceback (most recent call last):
    File "/home/pi/Desktop/Autostart.py", line 7, in <module>
    from rpi_ws281x import *
    ImportError: No module named rpi_ws281x

    Wenn ich jetzt aber den Code so ausführe, also mit sudo python3 Autostart.py im Desktop Ordner, funktioniert es ohne Probleme.


    Hiernoch der Anfang meines Codes:

    Habe auch schon probiert das Modul in einen Test Ordner zu installieren und das Script in den selben Ordner geschmissen. Was mache ich falsch?



    :danke_ATDE:

  • Wenn du nichts am System verbogen has rufst du mit sudo python3 Autostart.py  einmal dein Skript mit python 3 auf und einmal mit python 2 sudo python /home/pi/Desktop/Autostart.py. Ändere das mal.


    Gruß

    Steinardo

    • Official Post

    Btw. Die home/pi/.bashrc ist nicht besonders gut geeignet für einen Autostart, bzw. eher keine gute Idee dafür und sollte nur in absoluten Ausnahmefällen dafür herhalten. Immer wenn Du Dich z.B. per SSH am RPi anmeldest, würde das Skript erneut starten.

    Deshalb würde ich hier eher eine Systemd Service Unit oder ggf. auch einen Cronjob bevorzugen.

  • FloKnoe Anmerkungen zum Python-Quelltext:


    Die She-Bang-Zeile passt nicht zu der Art wie Du das aufrufst, denn die deutet auf ein selbstkompiliertes Python hin.


    ``as`` beim Importieren ist zum Umbenennen gedacht, `GPIO` wird aber gar nicht umbenannt.


    `argparse` und `datetime` werden importiert, aber überhaupt nicht verwendet.


    Sternchen-Importe sind Böse™. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.


    Der Kommentar ``# Importieren der System-Schnittstelle`` ist komisch eingerückt und ich sehe in dem Text auch gar keinen Sinn. Worauf bezieht der sich?


    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).


    Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Wirklich richtig unübersichtlich ist es wenn man auf Modulebene alles mischt, also zwischen Zeilen vom Hauptprogramm Funktionen und Konstanten definiert. Konstanten werden am Anfang des Moduls definiert.


    Am Programmende sollte man unbedingt `GPIO.cleanup()` aufrufen.


    Funktionsnamen und Methodennamen beschreiben üblicherweise die Tätigkeit, welche die Funktion oder Methode durchführt. `farben` ist keine Tätigkeit und wäre ein passender Namen für einen Wert der tatsächlich Farben repräsentiert. Beispielsweise eine Liste mit Farbnamen oder RGB-Werten.


    `os.popen()` sollte man nicht mehr verwenden. Die Dokumentation verweist auf das `subprocess`-Modul. Die beiden `bildschirm*()`-Funktionen machen auch fast das gleiche. Da würde man eher *eine* Funktion schreiben, die ein Argument bekommt ob der Bildschirm ein- oder ausgeschaltet werden soll.


    `wait_ms` ist ein komischer Name wenn der Wert zum Warten in der Schleife dann durch 10.000 geteilt wird und nicht durch 1.000 wie das ms suggeriert. Oder steht das nicht für Millisekunden?


    “I will not sell my kidney on eBay

    I will not sell my kidney on eBay

    I will not sell my kidney on eBay …” — Bart Simpson