Encore un pb avec crontab

Bonjour à tous.

je suis confronté à un pb de démarrage automatique d’un script python.

J’ai fait une démo minimaliste pour identifier la source du pb:

le script consiste à afficher une image sur un écran OLED et une boucle while attend qu’on appuie sur un autre bouton pour afficher une seconde image à la place de la première :

from PIL import Image, ImageDraw,ImageFont
import RPi.GPIO as GPIO
import adafruit_ssd1306
import busio
#import os

i2c = busio.I2C(3,2)
oled = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)

image_bw = Image.open("start.jpg")
image_bw = image_bw.convert("1")
oled.image(image_bw)
draw=ImageDraw.Draw(image_bw)
oled.show()

GPIO.setmode(GPIO.BCM)
GPIO.setup(20, GPIO.IN, pull_up_down = GPIO.PUD_UP)
s=True

while (s==True):
        if (GPIO.input(20)==GPIO.LOW):
                #os.system('sh start.sh')
                image_bw = Image.open("logo.jpg")
                image_bw = image_bw.convert("1")
                oled.image(image_bw)
                draw=ImageDraw.Draw(image_bw)
                oled.show()
                s=False

au démarrage, la première image s’affiche bien, mais rien ne se passe qd on appuie sur le bouton. Je précise que ce script fonctionne normalement en mode commande.
J’utilise un raspberry pi zero W.
crontab -e :
@reboot python start.py

Merci de votre aide.

le pb provient de GPIO à mon avis.
j’ai remplacé
@reboot python start.py
par
@reboot sleep 60 && python start.py
et cela fonctionne,
mais je ne trouve pas ça très satisfaisant car rien ne dit que le délai de 60 sera tjrs suffisant. je ne sais pas si la séquence de boot est stable dans la durée.

Tu pourrais créer un service ==>
Étape 1 – Votre script Python
Mon exemple de script a été stocké dans le répertoire /home/pi et nommé « pgBME2280.py ». Évidemment, votre script peut être appelé autrement, mais gardez un œil sur l’endroit où il est référencé dans les commandes et le texte ci-dessous.

Étape 2 – Créer un fichier d’unité
Ensuite, nous allons créer un fichier de configuration (alias un fichier d’unité) qui indique à systemd ce que nous voulons qu’il fasse et quand :

sudo nano /lib/systemd/system/pgBME280.service
Ajoutez dans le texte suivant :

/* *** */
[Unit]
Description=My Script Service
After=multi-user.target

[Service]
User=pi
Group=i2c
Type=idle
ExecStartPre=/bin/sleep 10
ExecStart=/bin/bash -c ‹ source /home/pi/Mesure/venv/bin/activate && python /home/pi/Mesure/pgBME280.py ›
WorkingDirectory=/home/pi/Mesure
restart=always
restartSec=5
[Install]

[Install]
WantedBy=multi-user.target
/* *** */

Vous pouvez enregistrer et quitter l’éditeur nano en utilisant [CTRL-X], [Y] ensuite [ENTER].

Cela définit un nouveau service appelé « My Script Service » et nous demandons qu’il soit lancé une fois que l’environnement multi-utilisateurs sera disponible.
Le paramètre « ExecStart » est utilisé pour spécifier la commande que nous voulons exécuter.
Le « Type » est défini sur « inactif » afin de garantir que la commande ExecStart n’est exécutée que lorsque tout le reste a été chargé.
Pour mes scripts basés sur GPIO, le type par défaut de « simple » ne fonctionnait pas.

Notez que les chemins sont absolus et définissent entièrement l’emplacement de Python ainsi que l’emplacement de notre script Python.

Afin de stocker la sortie texte du script dans un fichier journal, vous pouvez modifier la ligne ExecStart en :
/* *** /
ExecStart=/usr/bin/python /home/pi/Mesure/pgBME280.py > /home/pi/Mesure/pgBME280.log 2>&1
/
*** */

L’autorisation sur le fichier d’unité doit être définie sur 644 :
/* *** /
sudo chmod 644 /lib/systemd/system/pgBME280.service
/
*** */

Étape 3 – Configurer systemd
Maintenant que le fichier unité a été défini, nous pouvons dire à systemd de le démarrer pendant la séquence de démarrage :
/* *** /
sudo systemctl daemon-reload
sudo systemctl enable pgBME280.service
/
*** */

Redémarrez le Pi et votre service personnalisé devrait s’exécuter :
/* *** /
sudo reboot
/
*** */

Étape 4 – Vérifiez l’état de votre service
Vous pouvez vérifier l’état de votre service en utilisant :
/* *** /
sudo systemctl status pgBME280.service
/
*** /
pour supprilmer le service
/
*** */

sudo systemctl stop pgBME280.service
sudo systemctl disable pgBME280.service
sudo rm /etc/systemd/system/pgBME280.service
sudo rm /etc/systemd/system/pgBME280.service # and symlinks that might be related
sudo rm /usr/lib/systemd/system/pgBME280.service
sudo rm /usr/lib/systemd/system/pgBME280.service # and symlinks that might be related
systemctl daemon-reload
systemctl reset-failed

merci de ta réponse. J’ai déjà fait ça mais c’est lourd car il faut attendre que tout soit chargé donc le charger en dernier et la procédure pour faire ça est tres lourde. j’ai deja publié un post sur ça.