Wie boote ich nur in ein eigenes Python-Skript (GUI)?

12

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/autostartals 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.pyund @openboxwurden 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 startxhat 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.

Fantilein1990
quelle
Ich gebe zu, dass es nicht viel hilft, aber vielleicht lohnt es sich zu schauen, wie zB XBMC (oder eine andere HTPC-Dicrtibution) bootet? Alternativ könnte dies Ihre Frage beantworten raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Antworten:

12

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.

nodmist ein minimaler Anzeigemanager, der das Laden von LXDE umgeht und openbox(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 nodmmit apt-getund bearbeiten Sie die Datei /etc/default/nodm. Sie müssen die Option einstellen NODM_ENABLEDzu trueund NODM_USERzu pi(oder was auch immer Ihr Benutzername ist).

Erstellen Sie dann eine benutzerdefinierte Xsession-Datei in Ihrem Ausgangsordner ( /home/pi/.xsession) mit folgendem Inhalt (die whileSchleife ist nicht erforderlich, sie startet das Python-Skript nur automatisch neu, wenn es abstürzt):

#!/usr/bin/env bash
exec openbox-session &
while true; do
  python3 /home/pi/Documents/script.py
done

und das sollte alles sein, was notwendig ist, denke ich. Ich habe ein Bash-Skript geschrieben, um dies automatisch einzurichten:

sudo apt-get -y install nodm

# Edit nodm config file
sudo sed -i -e "s/NODM_ENABLED=false/NODM_ENABLED=true/" -e "s/NODM_USER=root/NODM_USER=pi/" \
  /etc/default/nodm

# Create custom Xsession file
printf "%s\n" \
  "#!/usr/bin/env bash" \
  "exec openbox-session &" \
  "while true; do" \
  "  python3 $PWD/main.py" \
  "done" \
  > /home/pi/.xsession

Anmerkungen:

  • Ich fand diesen Link hilfreich, aber einige der Informationen sind jetzt veraltet: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Sie verwenden den Matchbox-Fenstermanager, der nicht funktioniert hat Für mich, weil ich Unterstützung für mehrere Fenster benötigte, aber es könnte eine gute Option sein, wenn Sie dies nicht tun.
  • Die obige Lösung hat funktioniert, aber ich wollte eine möglichst leichte Umgebung, also bin ich zu Raspbian Lite gewechselt, das keine GUI hat, und habe von vorne angefangen, nur die Pakete zu installieren, die absolut notwendig sind. Der Prozess ist ziemlich ähnlich, aber zusätzlich zu nodmSie installieren müssen xserver-xorg, xinit, openboxund 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.
tjohnson
quelle
Hi tjohnson, ich habe die oben beschriebene Methode auf Raspbian angewendet und es funktioniert, danke! Ich wollte versuchen, Raspbian Lite zu nutzen, das Sie auch in Ihrer letzten Notiz erwähnt haben. Ich habe die von Ihnen aufgelisteten zusätzlichen Abhängigkeiten installiert, aber die App wurde nicht gestartet. Ich gehe davon aus, dass dies mit Ihrem letzten Kommentar zum Verschieben in ein separates Skript zusammenhängt. Ich habe keinen home / pi / .config / openbox-Ordner, also habe ich ihn und die Autostart-Datei erstellt, aber es scheint nicht zu funktionieren. Könnten Sie das bitte näher erläutern? Vielen Dank
AngeloQ
@AngeloQ hast du es geschafft, an Raspbian Lite zu arbeiten?
Paul
1

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.

nylesteiner
quelle
0

Der schmutzige Trick, den ich in der Vergangenheit bei RPi angewendet habe, bestand darin, Befehle in meine /etc/rc.localDatei direkt vor der exit 0Zeile zu setzen. In Ihrem Fall würde ich die folgende Zeile versuchen und neu starten.

python /full/path/to/file.py &

Da Sie angegeben haben, dass Berechtigungen auf Sudo-Ebene erforderlich sind, müssen Sie möglicherweise stattdessen den zuvor ausgeführten suBefehl anpassen , da es derzeit so aussieht, als würden Sie versuchen, ihn unter dem piBenutzer 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

python /full/path/to/file.py & || exit 0

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.

S0AndS0
quelle
Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Ghanima
0

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:

#!/bin/bash
echo "Starting program..."
cd /home/pi/myFolder
sudo python3 myPython.py $@ #$@ takes all arguments and passes them to python.
exit 0

Das muss man lauffähig machen mit chmod -x scriptName.sh.

Dann crontab -eim 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 , cdum 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.

Alexzoin
quelle