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

La version bêta du plugin pourrait corriger votre problème. Elle intègre une nouvelle gestion d’exécution des scripts.

Faites un essai :wink:

Bonjour et merci à tous pour vos contributions.

J’ai résolu le problème en partant de la proposition de @Mips : installation dans le répertoire « data » du plugin « script ».

Pour ce faire, j’ai supprimé le venv du /home/pi

deactivate
rm  -r /home/pi/scripts/venvYeelight/

puis je me suis inspiré du post de aztazt pour me connecter avec l’utilisateur www-data puis créer le venv venvYeelight dans le répertoire data :

pi@raspberry2b:~/scripts $ sudo su -
root@raspberry2b:~# su -l www-data -s /bin/bash
www-data@raspberry2b:~$ cd /var/www/html/plugins/script/data
www-data@raspberry2b:~/html/plugins/script/data$ python -m venv venvYeelight
www-data@raspberry2b:~/html/plugins/script/data$ ls -l
total 20
-rwxrwxr-x 1 www-data www-data   96 Jan  8 23:01 allumer.py
-rwxrwxr-x 1 www-data www-data  143 Apr 24 17:26 allumer.sh
-rwxrwxr-x 1 www-data www-data   96 Jan  8 23:01 eteindre.py
-rwxrwxr-x 1 www-data www-data  144 Apr 24 17:27 eteindre.sh
drwxr-xr-x 5 www-data www-data 4096 Apr 24 17:33 venvYeelight

J’ai réinstallé le module « yeelight » via « pip3 install yeelight » ; un warning est affiché mais ne semble pas bloquant dans mon cas de figure (j’ai rebooté et le module reste présent) :

www-data@raspberry2b:~/html/plugins/script/data$ source venvYeelight/bin/activate
(venvYeelight) www-data@raspberry2b:~/html/plugins/script/data/venvYeelight$ pip3 install yeelight
WARNING: The directory '/var/www/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting yeelight
  Downloading https://www.piwheels.org/simple/yeelight/yeelight-0.7.16-py3-none-any.whl (40 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 40.5/40.5 kB 7.5 MB/s eta 0:00:00
Collecting ifaddr
  Downloading https://www.piwheels.org/simple/ifaddr/ifaddr-0.2.0-py3-none-any.whl (12 kB)
Installing collected packages: ifaddr, yeelight
Successfully installed ifaddr-0.2.0 yeelight-0.7.16
(venvYeelight) www-data@raspberry2b:~/html/plugins/script/venvYeelight$ pip3 list
WARNING: The directory '/var/www/.cache/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
Package    Version
---------- -------
ifaddr     0.2.0
pip        23.0.1
setuptools 66.1.1
yeelight   0.7.16

Enfin, j’ai ajusté mes scripts .sh pour prendre en compte cette nouvelle localisation du venv :

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

Ma conclusion : comme pressenti, pas un problème au niveau du script mais plutôt des droits utilisateur (et de limite de connaissance de ma part).

Je passe ce sujet en résolu et je vous souhaite un excellent we.

1 « J'aime »

Merci @Michel_F.

Si ma compréhension de venv est correcte, « deactivate » est une fonction du script bin/activate et de ce fait, il ne faut pas spécifier le chemin vers « deactivate » (qui n’est pas un fichier dans /bin)

pi@raspberry2b:/var/www/html/plugins/script/data/venvYeelight/bin $ ls -l
total 36
-rw-r--r-- 1 www-data www-data 2031 Apr 24 17:33 activate
-rw-r--r-- 1 www-data www-data  957 Apr 24 17:33 activate.csh
-rw-r--r-- 1 www-data www-data 2233 Apr 24 17:33 activate.fish
-rw-r--r-- 1 www-data www-data 9033 Apr 24 17:33 Activate.ps1
-rwxr-xr-x 1 www-data www-data  262 Apr 24 17:33 pip
-rwxr-xr-x 1 www-data www-data  262 Apr 24 17:33 pip3
-rwxr-xr-x 1 www-data www-data  262 Apr 24 17:33 pip3.11
lrwxrwxrwx 1 www-data www-data   15 Apr 24 17:33 python -> /usr/bin/python
lrwxrwxrwx 1 www-data www-data    6 Apr 24 17:33 python3 -> python
lrwxrwxrwx 1 www-data www-data    6 Apr 24 17:33 python3.11 -> python
pi@raspberry2b:/var/www/html/plugins/script/data/venvYeelight/bin $

Bonjour et bienvenue, je viens juste de lire votre post de présentation hyper complet
Comme à dis quelqu’un "13ans de jeedom sans une question posée ouahh respect. et cette premiere question ou tout est complet, clair, l’impide : enorme
j’ai qu’un mot : bravo

Et encore bienvenue, je pense que tes 13ans de jeedom pourrons nous apporter bcp ici :slight_smile:

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.