Mon script bash échoue depuis l'implémentation de virtual environment venv (python)

Bonjour,

mon premier post, que j’espère OK. Le contexte est un script qui fonctionnait par le passé via le plugin « script », d’où ce tag, mais je pressens que l’origine du problème est ailleurs. Dans le doute, je l’ai créé ici.

Depuis le passage à bookworm par réinstallation complète, l’installation de module python sans Virtual Environnement n’est plus possible.

pi@raspberry2b:~ $ cat /etc/*release
PRETTY_NAME="Raspbian GNU/Linux 12 (bookworm)"

Or je pilote une ampoule Yeelight via un module python « Yeelight ».
Je me suis donc renseigné et j’ai procédé à l’installation d’un virtual environnement « venvYeelight » à partir de mon utilisateur « pi » (dans répertoire /home/pi/scripts/):

pi@raspberry2b:~/scripts/venvYeelight/bin $ ls -l
total 36
-rw-r--r-- 1 pi pi 2014 Apr 20 23:54 activate
-rw-r--r-- 1 pi pi  940 Apr 20 23:54 activate.csh
-rw-r--r-- 1 pi pi 2216 Apr 20 23:54 activate.fish
-rw-r--r-- 1 pi pi 9033 Apr 20 23:54 Activate.ps1
-rwxr-xr-x 1 pi pi  246 Apr 20 23:54 pip
-rwxr-xr-x 1 pi pi  246 Apr 20 23:54 pip3
-rwxr-xr-x 1 pi pi  246 Apr 20 23:54 pip3.11
lrwxrwxrwx 1 pi pi    7 Apr 20 23:53 python -> python3
lrwxrwxrwx 1 pi pi   16 Apr 20 23:53 python3 -> /usr/bin/python3
lrwxrwxrwx 1 pi pi    7 Apr 20 23:53 python3.11 -> python3

Le script d’allumage et celui d’extinction se trouvent dans « /var/www/html/plugins/script/data » :

pi@raspberry2b:/var/www/html/plugins/script/data $ ls -l
total 16
-rwxrwxr-x 1 www-data www-data  96 Jan  8 23:01 allumer.py
-rwxrwxr-x 1 www-data www-data  66 Jan  8 23:01 allumer.sh
-rwxrwxr-x 1 www-data www-data  96 Jan  8 23:01 eteindre.py
-rwxrwxr-x 1 www-data www-data 127 Apr 21 18:40 eteindre.sh

où :

« eteindre.sh »

#!/bin/bash
source /home/pi/scripts/venvYeelight/bin/activate
python3 /var/www/html/plugins/script/data/eteindre.py
deactivate

et :

« eteindre.py »

#!/usr/bin/env python

from yeelight import Bulb

bulb = Bulb("10.1.1.2")
bulb.turn_off()

Le pilotage « manuel » (depuis un terminal du raspberry) est fonctionnel : je peux allumer et éteindre l’ampoule via ces scripts (via l’utilisateur « pi », si j’ai bien compris) :

pi@raspberry2b:~ $ 
pi@raspberry2b:~ $ cd /var/www/html/plugins/script/data/
pi@raspberry2b:/var/www/html/plugins/script/data $ ./allumer.sh
pi@raspberry2b:/var/www/html/plugins/script/data $ ./eteindre.sh
pi@raspberry2b:/var/www/html/plugins/script/data $

Le blocage apparaît lorsque je souhaite lancer ces scripts depuis le plugin « scripts » : rien ne se passe quand j’appuie sur le bouton « tester » des commandes.

Les logs du plugin affichent alors les erreurs suivantes :

[2026-04-23 16:36:16] ERROR  Erreur exécution de la commande [obj-salon][script-actionner-ampoule-bash][light-salon-off] : Erreur sur sudo chmod +x /var/www/html/plugins/script/data/eteindre.sh 2>/dev/null;/var/www/html/plugins/script/data/eteindre.sh 2>&1 valeur retournée : 127. Détails : /var/www/html/plugins/script/data/eteindre.sh: line 2: /home/pi/scripts/venvYeelight/bin/activate: Permission denied
Traceback (most recent call last):
File "/var/www/html/plugins/script/data/eteindre.py", line 3, in <module>
from yeelight import Bulb
ModuleNotFoundError: No module named 'yeelight'
/var/www/html/plugins/script/data/eteindre.sh: line 4: deactivate: command not found


[2026-04-23 16:52:51] ERROR  Erreur exécution de la commande [obj-salon][script-actionner-ampoule-bash][light-salon-on] : Erreur sur sudo chmod +x /var/www/html/plugins/script/data/allumer.sh 2>/dev/null;/var/www/html/plugins/script/data/allumer.sh 2>&1 valeur retournée : 127. Détails : /var/www/html/plugins/script/data/allumer.sh: line 2: /home/pi/scripts/venvYeelight/bin/activate: Permission denied
Traceback (most recent call last):
File "/var/www/html/plugins/script/data/allumer.py", line 3, in <module>
from yeelight import Bulb
ModuleNotFoundError: No module named 'yeelight'
/var/www/html/plugins/script/data/allumer.sh: line 4: deactivate: command not found

Mes réflexions/tests :
Le message d’erreur affiche un « Permission Denied » sur le fichier « activate » du venvYelight.
Ce fichier appartient à l’utilisateur « pi » et au groupe « pi ».
Or, j’ai cru comprendre que les scripts sont lancés avec l’utilisateur « www-data », donc j’ai d’abord essayé d’ajouter cet utilisateur au groupe « pi » (sudo usermod -aG pi www-data) : pas mieux/même erreur
J’ai également essayé un « chmod 777 activate » (retiré depuis) : pas mieux/même erreur
J’ai trouvé les sujets suivants sur la communauté, mais cela ne m’a pas débloqué :
https://community.jeedom.com/t/lancer-script-python-avec-venv-modules-non-trouves/20495
https://community.jeedom.com/t/question-generale-sur-les-droits-de-www-data-pb-script-python/55651

Conclusion : tout porte à croire à un bête problème de droits de l’utilisateur « www-data » sur le virtual environnement « venvYeelight » mais je ne parviens pas à mettre le doigt dessus.
L’un d’entre vous aurait-il une idée ?

Merci d’avance pour vos suggestions.

Note 1 - le module yeelight est bien installé dans le venvYeelight (et ça fonctionne via activation manuelle)

pi@raspberry2b:~ $ 
pi@raspberry2b:~ $ source /home/pi/scripts/venvYeelight/bin/activate
(venvYeelight) pi@raspberry2b:~ $ pip3 list
Package    Version
---------- -------
ifaddr     0.2.0
pip        23.0.1
setuptools 66.1.1
yeelight   0.7.16
(venvYeelight) pi@raspberry2b:~ $ 
(venvYeelight) pi@raspberry2b:~ $ deactivate
pi@raspberry2b:~ $

Note 2 - la page santé du Jeedom :

Bonjour,

Et vous appelez le script comment ?

Mettez le path complet vers le bin python3 (celui du venv que vous avez créé) suivi du path vers le script .py et pas juste le script


Mais j’aurais créé le venv dans le dossier du data du plugin, ensuite remettre les droits à www-data, et pas dans le home de pi

Merci d’avoir pris le temps de répondre.

Et vous appelez le script comment ?

Pour mes tests qui échouent, j’appelle les 2 scripts « allumer.sh » et « eteindre.sh » via les boutons « tester » des commandes « light-salon-on » et « light-salon-off » du script « script-actionner-ampoule-bash »

En mode nominal, ces 2 commandes font partie d’un virtuel, appelé par mes scénarios.

Mettez le path complet vers le bin python3 (celui du venv que vous avez créé) suivi du path vers le script .py et pas juste le script

Pas sûr de comprendre : vous proposez de remplacer « python3 » par le path complet (« /home/pi/scripts/venvYeelight/bin/python3 » dans le script ?

J’ai donc modifié le script eteindre.sh comme suit :

#!/bin/bash
source /home/pi/scripts/venvYeelight/bin/activate
/home/pi/scripts/venvYeelight/bin/python3 /var/www/html/plugins/script/data/eteindre.py
deactivate

Résultats des tests :

  1. « manuellement » (via terminal, hors jeedom) : ça fonctionne (comme auparavant)
  2. via Jeedom : pas mieux/même erreur

Je débute dans venv mais j’avais compris que l’activation du venv modifiait justement automatiquement le PATH :

pi@raspberry2b:~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
pi@raspberry2b:~ $ source scripts/venvYeelight/bin/activate
(venvYeelight) pi@raspberry2b:~ $ echo $PATH
/home/pi/scripts/venvYeelight/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games
(venvYeelight) pi@raspberry2b:~ $

Mais j’aurais créé le venv dans le dossier du data du plugin, ensuite remettre les droits à www-data, et pas dans le home de pi
Je prends note et je vais essayer, je suis preneur de toutes les propositions.

Bonjour,

Et sans modifier le répertoire avant d’exécuter les scripts ? C’est à dire en laissant le répertoire sur ~ (home).
Je pense que deactivate devrait être appelé avec son chemin absolu dans le script.

À+
Michel