Comment démarrer dans son propre script python (GUI) uniquement?

12

J'ai le problème suivant: en utilisant un RaspPi 3B exécutant Raspbian Jessie (version 4.4.26-v7 +), je voudrais que l'interface graphique d'un script python auto-écrit soit exécutée au démarrage.

Je sais que cette question a été posée sur ce site ainsi que sur d'autres, mais comme Raspbian continue de changer et qu'aucune des solutions suggérées avant n'a fonctionné pour moi (voir ci-dessous), je voudrais la poser à nouveau.

D'après ma compréhension, je dois charger XServer et exécuter mon script par la suite. Cela devrait se produire au lieu de charger l'ensemble du bureau.

Un moyen d'y parvenir est censé être via le fichier de démarrage automatique LXDE (comme indiqué dans cette réponse ). J'ai édité le fichier /etc/xdg/lxsession/LXDE-pi/autostartainsi que le fichier /etc/xdg/lxsession/LXDE/autostart(le premier contenait à l'origine quatre lignes au lieu de trois comme suggéré dans l'article référencé) - en ajoutant les lignes @sudo python /full/path/to/file.pyet @openbox, mais mon Pi démarre toujours sur le bureau et n'exécute pas automatiquement le script du tout. Annotation: J'ai essayé uniquement la ligne de script et la ligne de script avec la ligne openbox pour l'un des fichiers et pour les deux fichiers ensemble.

Une autre stratégie implique le fichier rc.local (comme suggéré dans la documentation officielle ). Cependant, l'ajout python /full/path/to/file.py &n'a pas fonctionné (car il manquait encore mon interface graphique) et l'ajout startxn'a pas aidé car je ne pouvais apparemment pas lier le startx au script python et le premier s'est donc fermé immédiatement après son démarrage.

Certains suggèrent que (en plus) .xinitrc devrait être utilisé. Cependant, cela n'a pas fonctionné non plus:

su -c python /full/path/to/file.py pi

Et, last but not least, d'une certaine manière, cela devrait être faisable en utilisant init.d - mais je n'ai pas encore trouvé de détails à ce sujet.

J'apprécierais vraiment tout indice dans la bonne direction. Où est mon erreur? À quoi devrait ressembler ma ligne en rc.local ou .xinitrc? Ou y a-t-il eu des changements majeurs liés au passage au pixel et devrais-je essayer autre chose?


Quelques informations supplémentaires: Le script a besoin des droits sudo. Il est écrit en Python 2.7, l'interface graphique utilise Tkinter. L'interface graphique remplit complètement l'écran, donc les arrière-plans ne sont pas pertinents. Le script est censé s'exécuter pour toujours (ou jusqu'à ce qu'il soit arrêté par une entrée utilisateur via l'interface graphique) et utilise des services système comme le wifi et Ethernet.


Plus d'informations: Tout se passe localement.


Clarification: j'ai maintenant passé plus de 8 heures à chercher sur le net, à essayer des didacticiels à partir de différents points de départ ou à les mélanger. J'en suis arrivé à la conclusion que mon script (qui fonctionne parfaitement lorsqu'il est démarré en pixel) ne fonctionne pas s'il est exécuté dans un environnement non-bureau (ce dont je doute) ou qu'un nouveau tutoriel est nécessaire, car les modifications d'octobre 2016 en Raspbian a rendu obsolètes tous les anciens didacticiels. De plus, le défi ne consiste pas à démarrer le script ou à démarrer Xserver (ou quelque chose de similaire) indépendamment les uns des autres, mais à faire les deux liés de sorte que le script utilise l'affichage créé par Xserver.

Fantilein1990
la source
J'avoue que cela ne nous est pas d'une grande aide, mais peut-être vaut-il la peine de voir comment, par exemple, XBMC (ou autre dicrtibution HTPC) démarre? Alternativement, cela répondrait peut-être à votre question raspberrypi.stackexchange.com/questions/11866/…
Petr Gladkikh

Réponses:

12

Depuis un mois environ, je travaille essentiellement sur la même chose, j'ai donc beaucoup cherché comment faire cela et je sais comment le faire avec la dernière version de Raspbian (PIXEL).

nodmest un gestionnaire d'affichage minimal qui contourne le chargement de LXDE et openbox(qui est déjà installé sur le Pi) fournit un gestionnaire de session minimal et fonctionne avec le serveur X.

Pour mettre en place cet environnement dans Raspbian, installer nodmavec apt-getet modifier le fichier /etc/default/nodm. Vous devez définir l'option NODM_ENABLEDsur trueet NODM_USERsur pi(ou quel que soit votre nom d'utilisateur).

Créez ensuite un fichier Xsession personnalisé dans votre dossier de départ ( /home/pi/.xsession) avec le contenu suivant (la whileboucle n'est pas nécessaire, elle redémarre automatiquement le script Python s'il se bloque):

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

et cela devrait être tout ce qui est nécessaire je pense. J'ai écrit un script Bash pour le configurer automatiquement:

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

Remarques:

  • J'ai trouvé ce lien utile, mais certaines informations sont désormais obsolètes: https://blog.qruizelabs.com/2014/04/29/raspberrypi-kiosk-matchbox-uzbl/ Ils utilisent le gestionnaire de fenêtres Matchbox, qui n'a pas fonctionné pour moi parce que j'avais besoin de plusieurs fenêtres, mais ce pourrait être une bonne option si vous ne le faites pas.
  • La solution ci-dessus a fonctionné, mais je voulais un environnement aussi léger que possible, alors je suis passé à Raspbian Lite qui n'a pas d'interface graphique et j'ai recommencé à zéro en installant uniquement les packages qui sont absolument nécessaires. Le processus est assez similaire, mais en plus nodmvous devez installer xserver-xorg, xinit, openboxet toutes les autres dépendances votre script a. Ensuite, si vous utilisez Openbox, au lieu d'exécuter le script Python dans le fichier Xsession, la partie du code qui l'exécute doit être déplacée vers un script distinct ( /home/pi/.config/openbox/autostart). Je peux élaborer davantage sur la façon de procéder si vous le souhaitez.
tjohnson
la source
Salut tjohnson, j'ai utilisé la méthode que vous avez décrite ci-dessus sur Raspbian et je l'ai fait fonctionner, merci! Je voulais essayer de faire sur Raspbian Lite également que vous avez mentionné dans votre dernière note. J'ai installé les dépendances supplémentaires que vous avez répertoriées mais l'application n'a pas démarré. Je suppose que cela est lié à votre dernier commentaire sur le déplacement de cela dans un script séparé. Je n'ai pas de dossier home / pi / .config / openbox donc je l'ai créé et le fichier de démarrage automatique mais il ne semble pas fonctionner. Pourriez-vous nous en dire plus? Merci
AngeloQ
@AngeloQ l'avez-vous fait fonctionner sur Raspbian Lite?
Paul
1

Le fichier de démarrage automatique existe à plusieurs endroits différents. Il s'agit simplement de modifier le bon fichier de démarrage automatique au bon chemin. J'ai essayé d'éditer /home/pi/.config/lxsession/LXDE-pi/autostart. Cela a finalement fait l'affaire pour moi.

/etc/xdg/lxsession/LXDE-pi/autostart semble être le mauvais chemin.

nylesteiner
la source
0

La sale astuce que j'ai utilisée sur RPi dans le passé était de mettre des commandes dans mon /etc/rc.localfichier juste avant la exit 0ligne. Dans votre cas, j'essaierais la ligne suivante et redémarrerais.

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

Comme vous avez indiqué que les autorisations de niveau sudo sont nécessaires, vous devrez peut-être ajuster la sucommande que vous avez précédemment essayée, car en ce moment, il semble que vous essayez de l'exécuter sous l' piutilisateur.

Un avertissement concernant ma suggestion d'utilisation du fichier rc.local, si votre script se termine avec un état non nul, vous ne terminerez pas le démarrage, donc pour être plus sûr pendant les tests, vous pouvez essayer ce qui suit pour garantir que la sortie est toujours égale à 0

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

Modifications et mises à jour

En regardant certaines données de recherche, nous avons trouvé un instructable qui montre l'utilisation d'un script de lancement référencé dans l'onglet cron pour faciliter le chargement des scripts python. Cela peut sembler sur le point de charger cron pour charger un script sh / bash afin de charger python mais ... c'est assez compliqué pour avoir un sens tordu.

S0AndS0
la source
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
Ghanima
0

Donc, selon l'entrée de votre code, cette solution peut fonctionner.

La première chose que j'ai faite a été de créer un script dans mon répertoire / qui ressemble à ceci:

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

Vous devez rendre cela exécutable avec chmod -x scriptName.sh.

Ensuite, faites crontab -edans le terminal et ajoutez@reboot sudo bash /scriptName.sh

Réglez votre option de démarrage sur CLI et vous devriez être prêt à partir! Cela a fonctionné sur mon Raspbian 3B.

Une mise en garde, si vous utilisez un écran tactile pour votre kiosque / écran, je n'ai pas encore compris. Cela fonctionnera bien avec la saisie de la souris, mais en ce qui concerne la saisie tactile, au moins pour l'écran que j'essaie d'utiliser, il sera éteint d'une manière qui le rendra inutilisable.

Remarque : Si votre code fait des IO de fichiers comme le mien, vous devez utiliser cdpour naviguer vers l'emplacement de votre code dans votre script de lancement ou python supposera que son emplacement est celui de votre script et effectuera les IO de fichiers en conséquence.

Alexzoin
la source