Ich habe folgendes Problem: Unter Verwendung eines RaspPi 3B mit Raspbian Jessie (Version 4.4.26-v7 +) möchte ich, dass die GUI eines selbstgeschriebenen Python-Skripts beim Start ausgeführt wird.
Ich weiß, dass diese Frage sowohl auf dieser Website als auch auf anderen gestellt wurde, aber da sich Raspbian ständig ändert und keine der zuvor vorgeschlagenen Lösungen für mich funktioniert hat (siehe unten), möchte ich sie erneut stellen.
Nach meinem Verständnis muss ich XServer laden und mein Skript anschließend ausführen. Dies sollte passieren, anstatt den gesamten Desktop zu laden.
Eine Möglichkeit, dies zu erreichen, soll die LXDE-Autostart-Datei sein (wie in dieser Antwort beschrieben ). Ich habe sowohl die Datei /etc/xdg/lxsession/LXDE-pi/autostart
als auch die Datei bearbeitet /etc/xdg/lxsession/LXDE/autostart
(die erstere enthielt ursprünglich vier statt drei Zeilen, wie in dem Beitrag angegeben) - die Zeilen @sudo python /full/path/to/file.py
und @openbox
wurden hinzugefügt , aber mein Pi bootet immer noch auf dem Desktop und führt das Skript überhaupt nicht automatisch aus. Anmerkung: Ich habe nur die Skriptzeile und die Skriptzeile zusammen mit der Openbox-Zeile für eine der Dateien und für beide Dateien zusammen ausprobiert.
Eine andere Strategie betrifft die Datei rc.local (wie in der offiziellen Dokumentation vorgeschlagen ). Allerdings hat nur das Hinzufügen python /full/path/to/file.py &
nicht funktioniert (da noch meine GUI fehlte) und das weitere Hinzufügen startx
hat nicht geholfen, da ich das startx anscheinend nicht mit dem Python-Skript verknüpfen konnte und das erstere daher sofort nach dem Start geschlossen wurde.
Einige schlagen vor , dass (zusätzlich) .xinitrc verwendet werden sollte. Dies funktionierte jedoch auch nicht:
su -c python /full/path/to/file.py pi
Und zu guter Letzt sollte es in gewisser Weise mit init.d machbar sein - Details dazu habe ich aber noch nicht gefunden.
Ich würde mich über jeden Hinweis in die richtige Richtung sehr freuen. Wo ist mein Fehler? Wie soll meine Zeile in rc.local oder .xinitrc aussehen? Oder hat sich im Zusammenhang mit der Umstellung auf Pixel einiges getan, und ich sollte etwas anderes ausprobieren?
Einige zusätzliche Informationen: Das Skript benötigt Sudo-Rechte. Es ist in Python 2.7 geschrieben, die GUI verwendet Tkinter. Die Benutzeroberfläche füllt den Bildschirm vollständig aus, sodass Hintergründe keine Rolle spielen. Das Skript soll für immer ausgeführt werden (oder bis es durch Benutzereingaben über die GUI gestoppt wird) und verwendet Systemdienste wie WLAN und Ethernet.
Weitere Informationen: Alles geschieht vor Ort.
Erläuterung: Inzwischen habe ich mehr als 8 Stunden im Internet gesucht, Tutorials von verschiedenen Ausgangspunkten aus ausprobiert oder zusammengemischt. Ich bin zu dem Schluss gekommen, dass entweder mein Skript (das beim Start in Pixel einwandfrei funktioniert) nicht funktioniert, wenn es in einer Nicht-Desktop-Umgebung ausgeführt wird (was ich bezweifle), oder dass ein neues Tutorial erforderlich ist, da der Oktober 2016 auf Raspbian umgestellt wird Ältere Tutorials wurden überholt. Darüber hinaus besteht die Herausforderung nicht darin, das Skript oder Xserver (oder etwas Ähnliches) unabhängig voneinander zu starten, sondern beides zu tun, damit das Skript die von Xserver erstellte Anzeige verwendet.
Antworten:
Seit ungefähr einem Monat arbeite ich im Grunde genau an der gleichen Sache, also habe ich viel nachgeforscht, wie man das macht und weiß, wie man es mit der neuesten Version von Raspbian (PIXEL) macht.
nodm
ist ein minimaler Anzeigemanager, der das Laden von LXDE umgeht undopenbox
(der bereits auf dem Pi installiert ist) einen minimalen Sitzungsmanager bereitstellt und mit dem X-Server zusammenarbeitet.Um diese Umgebung in Raspbian einrichten, installieren Sie
nodm
mitapt-get
und bearbeiten Sie die Datei/etc/default/nodm
. Sie müssen die Option einstellenNODM_ENABLED
zutrue
undNODM_USER
zupi
(oder was auch immer Ihr Benutzername ist).Erstellen Sie dann eine benutzerdefinierte Xsession-Datei in Ihrem Ausgangsordner (
/home/pi/.xsession
) mit folgendem Inhalt (diewhile
Schleife ist nicht erforderlich, sie startet das Python-Skript nur automatisch neu, wenn es abstürzt):und das sollte alles sein, was notwendig ist, denke ich. Ich habe ein Bash-Skript geschrieben, um dies automatisch einzurichten:
Anmerkungen:
nodm
Sie installieren müssenxserver-xorg
,xinit
,openbox
und alle anderen Abhängigkeiten Ihr Skript hat. Wenn Sie Openbox verwenden, muss der Teil des ausgeführten Codes in ein separates Skript verschoben werden (/home/pi/.config/openbox/autostart
) , anstatt das Python-Skript in der Xsession-Datei auszuführen . Wenn gewünscht, kann ich mehr darüber ausarbeiten.quelle
Die Autostart-Datei existiert an verschiedenen Stellen. Es geht einfach darum, die richtige Autostart-Datei am richtigen Pfad zu bearbeiten. Ich habe versucht zu bearbeiten
/home/pi/.config/lxsession/LXDE-pi/autostart
. Das hat endlich den Trick für mich getan./etc/xdg/lxsession/LXDE-pi/autostart
scheint der falsche Weg zu sein.quelle
Der schmutzige Trick, den ich in der Vergangenheit bei RPi angewendet habe, bestand darin, Befehle in meine
/etc/rc.local
Datei direkt vor derexit 0
Zeile zu setzen. In Ihrem Fall würde ich die folgende Zeile versuchen und neu starten.Da Sie angegeben haben, dass Berechtigungen auf Sudo-Ebene erforderlich sind, müssen Sie möglicherweise stattdessen den zuvor ausgeführten
su
Befehl anpassen , da es derzeit so aussieht, als würden Sie versuchen, ihn unter dempi
Benutzer auszuführen .Eine Warnung zu meinem Vorschlag für die Verwendung von rc.local-Dateien: Wenn Ihr Skript mit einem Status ungleich Null beendet wird, wird der Startvorgang nicht abgeschlossen. Um die Sicherheit während der Tests zu erhöhen, können Sie Folgendes versuchen, um zu verhindern, dass das Beenden immer noch gleich 0 ist
Bearbeitungen und Aktualisierungen
Beim Durchsuchen einiger Suchdaten wurde eine Anweisung gefunden , die die Verwendung eines Startskripts veranschaulicht, auf das in der Registerkarte cron verwiesen wird, um das Laden von Python-Skripten zu erleichtern. Es mag so aussehen, als würde man cron laden, um ein sh / bash-Skript zu laden, um Python zu laden, aber ... es ist so verwickelt, dass es einen verdrehten Sinn ergibt.
quelle
Je nachdem, welche Eingabe Ihr Code benötigt, funktioniert diese Lösung möglicherweise.
Das erste, was ich getan habe, war ein Skript in meinem / -Verzeichnis zu erstellen, das so aussieht:
Das muss man lauffähig machen mit
chmod -x scriptName.sh
.Dann
crontab -e
im Terminal machen und hinzufügen@reboot sudo bash /scriptName.sh
Stellen Sie Ihre Startoption auf CLI und Sie sollten bereit sein zu gehen! Dies funktionierte auf meinem 3B-Raspbian.
Eine Einschränkung, wenn Sie einen Touchscreen für Ihren Kiosk / Bildschirm verwenden, muss ich es erst noch herausfinden. Bei Mauseingaben funktioniert es einwandfrei, aber bei Berührungseingaben ist es zumindest für den Bildschirm, den ich verwenden möchte, auf eine Weise ausgeschaltet, die es unbrauchbar macht.
Hinweis : Wenn Ihr Code wie meine Datei IO tun Sie müssen verwenden ,
cd
um Ihren Code Standort im Launcher - Skript oder Python zu navigieren wird seine Position davon aus, dass Ihr Skript und wird Datei IO entsprechend auszuführen.quelle