Jump to content

Autostart Python Script auf Raspberry Pi


Recommended Posts

Liebe Tinkerforge Community,

nun habe ich mein erstes Python Script erstellt und die Funktionen der einzelnen Bausteine verifiziert. Sicher gibt es da noch einiges an Verbesserungsmöglichkeiten aber es tut was es soll und das ist für mich als Maschinenbauer, Ende Fünfzig schon einmal ein Erfolg. Über Hinweise und Tipps freue ich mich natürlich. 
Nun hätte ich es gern so, dass wenn der Raspberry Pi startet das Script ebenfalls gestartet wird. Von den vielen Methoden dies zu erreichen habe ich zwei ausprobiert (rc.local und systemd) mit ähnlichem Misserfolg.

In die rc.local habe ich folgende Zeile vor  exit 0 eingetragen:
python /home/pi/MyFirstScript.py >/tmp/MyFirstScript.log 2>&1 &

Die im Verzeichnis tmp erstellte Datei MyFirstScript.log liefert folgendes:
Traceback (most recent call last):
  File "/home/pi/MyFirstScript.py", line 12, in <module>
    from tinkerforge.ip_connection import IPConnection
ImportError: No module named tinkerforge.ip_connection

Bei der Methode systemd listet der Befehl sudo systemctl status myscript.service eine ähnliche Fehlermeldung.

Sicher habt ihr dafür Lösungsvorschläge. Vielen Dank im voraus!
Euer Max Mustermann

 MyFirstScript.py

Link to post
Share on other sites

Hallo Max Mustermann ...

ein paar kleine Anmerkungen:

1.) Hast du die tinkerforge bindings installiert? pip3 install tinkerforge  --> für den Raspi 
2.) Es ist meiner Erfahrung nach nicht optimal mit input in python zu warten wenn du auch keinen Input erwartet also in deinem Fall da du dies ja als deamon laufen lassen möchtest.
Es würde sich sowas anbieten:

import threading
# Anstatt input
waiting = threading.Event()
waiting.wait()

3. Würde ich dir empfehlen deinen Code eventuell auf den Robusten Ansatz umzustrukturieren um Probleme zu vermeiden.

Grüße
Markus

Link to post
Share on other sites

Hallo Markus,

vielen Dank für deine Hinweise und Tipps. Die tinkerforge bindings sind installiert. Ich nehme mal an, dass ohne die bindings das Python Script nicht laufen würde. Dies tut es, wenn ich es manuell starte. Die Fehlermeldung im Logfile zeigt auf Zeile 12 im Script beginnend mit <from ...> . Auch wenn ich die Reihenfolge der from-Aufrufe verändere, beschwert sich das Logfile immer an Zeile 12. Es muss also an dem Aufruf <from> liegen. Was könnten die Ursachen dafür sein? 

Punkt 2.) habe ich umgesetzt. <import threading> funktioniert genauso wie <import time>. Was ist der Vorteil deines Vorschlags?

Mit dem Robusten Ansatz werde ich mich in den kommenden Tagen auseinandersetzen und erst einmal an einem kleineren Script mit wenig Funktionalität üben. Eine Anwendung, die möglichst robust gegenüber Störungen in der Kommunikation ist, wäre mir auch wichtig. Danke für den Tipp!

Viele Grüße
Max

Link to post
Share on other sites

Wie startest du das script? Mit python3 "scriptname.py"
Verwendest du eine Virtualenvironment? 

Wenn du den Python Interpreter mit python3 startest und dann in die interaktive shell dein import eingibst kommt dann der gleiche Fehler?
Es macht einen Unterschied ob du mit pip(für python version 2.*) oder mit pip3(für python version 3.*) die bindings installierst. Vielleicht hast du da etwas verwechselt?

Grüße

Markus

Link to post
Share on other sites

Moin Markus,

das Script läuft unter Python 3.7.3. Manuell gestartet ist alles prima sowohl im Eingabefenster <python MyFirstScript.py> als auch unter Thonny 3.3.0, welches ebenfalls auf Python 3.7.3 zugreift. Nur in Verbindung mit dem Autostart kommt es zu den beschriebenen Fehlern (siehe Logfile). 
Was ist denn eine Virtualenvironment? Ich weiß, dass solche Fragen für Profis oft schwer zu ertragen sind. Aber nur wer fragt lernt auch etwas. 

Danke und beste Grüße
Max

Link to post
Share on other sites

Normal ist es so das unter raspian(debian) der Befehl "python" auf die Version 2.* von python zeigt und der Befehl "python3" auf die Version 3.* von python zeigt, genau wie mit "pip" und "pip3". Das kann man zwar ändern ist aber nach dem frischen installieren so. Über die local.rc Datei müsstest du also auch "python3" anstatt python schreiben wenn du das script mit python3 starten möchtest. Schau mal hier: rc.local - Raspberry Pi Documentation

Und unter systemd ist das ähnlich. systemd - Raspberry Pi Documentation

Grundsätzlich würde ich dir dazu raten systemd zu verwenden dann kannst du dein Programm mit systemctl start bzw. stop etc. steuern. 

Virtualenvironments kannst du hier nachlesen: Python Virtual Environments: A Primer – Real Python
Kurz: Damit kannst du deine eigene Laufzeitumgebung unabhängig vom global installiertem python erstellen. 

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...