Script ne fonctionne plus après passage sur VM Debian 11

Bonjour
Je suis en train de passer mon installation Jeedom depuis une machine physique NUC sur Debian 10 vers un Jeedom Debian 11 sur Proxmox (aussi sur un NUC Intel).
J’ai un script qui s’exécute normalement sur la machine en v10 mais se plante sur la machine en v11 avec le message :

Erreur sur /var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY 2>&1 valeur retournée : 127. Détails : sh: 1: /var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY: not found

Bien entendu, j’ai vérifié que PyEmVue.PY existait bien dans le répertoire spécifié. J’ai même recréé le script en allant chercher le .PY dans son répertoire.
Quand je lance le script en ligne de commande depuis son répertoire avec python3 PyEmVue.PY, en root, il s’exécute sans souci.
Quand je le lance avec mon utilisateur Debian, il se plante :

Traceback (most recent call last):
  File "/var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY", line 34, in <module>
    vue.login(username=user, password=passuser, token_storage_file=token)
  File "/usr/local/lib/python3.9/dist-packages/pyemvue/pyemvue.py", line 207, in login
    self.auth = Auth(
  File "/usr/local/lib/python3.9/dist-packages/pyemvue/auth.py", line 51, in __init__
    self.tokens = self.refresh_tokens()
  File "/usr/local/lib/python3.9/dist-packages/pyemvue/auth.py", line 59, in refresh_tokens
    self.token_updater(tokens)
  File "/usr/local/lib/python3.9/dist-packages/pyemvue/pyemvue.py", line 231, in _store_tokens
    with open(self.token_storage_file, 'w') as f:
PermissionError: [Errno 13] Permission denied: 'keys.json'

J’ai essayé de renommer le keys.json pour qu’il en génère un autre, mais même log.
J’ai essayé de donner les droits (je comprends qu’il ne faut jamais faire ça, mais…) avec des chmod 766 sur les fichiers du répertoire (et le répertoire lui même), mais même chose.
Vu que c’est le même compte et mdp qui sont définis en début de script pour se connecter, et les mêmes que sur Debian 10 où ça fonctionne pour tous les utilisateurs, je pense que c’est un problème de droits, ou alors un changement entre debian 10 et 11 (j’ai cru voir que c’est Python 3.9 en Debian 11 et que c’était 3.7 en 10)
Je suis hélas totalement incompétent en Linux, tout ce que je sais faire c’est de copier sans jamais vraiment les comprendre des commandes données d’un forum à l’autre.
Je vous passe aussi tout le scrip (après y avoir changé bien sur mes identifications) :

#!/usr/bin/python3.7
# Script recupere infos de PyEmVue

# import librairies
import sys, os

# Variables de connexion
user = "MonMail@MonProvider.ext"
passuser = "MonMotdePasse"
duree = "1MIN"
token = 'keys.json'
resultat = "PyEmVue.log"

# recupere la date et l'heure actuelle
from datetime import datetime
now = datetime.now()
ma_date = now.strftime("%d/%m/%Y %H:%M:%S")

from pyemvue import PyEmVue

def print_recursive(usage_dict, info, depth=0):
    for gid, device in usage_dict.items():
        for channelnum, channel in device.channels.items():
            name = channel.name
            if name == 'Main':
                name = info[gid].device_name
            print('-'*depth, f'{gid} {channelnum} {name} {channel.usage} kwh')
            fichier.write(f'{gid} {channelnum} {name} {channel.usage} kwh\n')

            if channel.nested_devices:
                print_recursive(channel.nested_devices, depth+1)

vue = PyEmVue()
vue.login(username=user, password=passuser, token_storage_file=token)

devices = vue.get_devices()
device_gids = []
info = {}

# Fichier pour ecrire le resultat
PyEmVueFile = os.path.abspath(os.path.dirname(sys.argv[0])) + "/" + resultat
fichier = open(PyEmVueFile, "a")
#fichier.write("Date " + ma_date)
fichier.write("Date " + ma_date + "\n")

for device in devices:
    if not device.device_gid in device_gids:
        device_gids.append(device.device_gid)
        info[device.device_gid] = device
    else:
        info[device.device_gid].channels += device.channels

device_usage_dict = vue.get_device_list_usage(deviceGids=device_gids, instant=None, scale=duree, unit="KilowattHours")
print_recursive(device_usage_dict, info)

fichier.write("\n*** C'est fini ***")
fichier.close()

# Supprime le fichier si il n'y a pas d'infos PyEmVue
if not(device_gids):
  if os.path.exists(PyEmVueFile):
    os.remove(PyEmVueFile)

exit

J’ai même essayé de refaire toute l’install de ce script et de ses dépendances, pour un résultat pire qui m’a obligé à restaurer un snapshot.
SI quelqu’un peut être assez sympa pour m’aider. C’est le dernier truc qui me manque pour migrer sur la nouvelle machine. J’enrage de ne pas trouver.
Merci beaucoup

Hello les spécialistes
Personne n’a d’idée ? Ca fait deux jours que je suis dessus je ne sais plus quoi essayer. La même chose fonctionne impec dans l’install Debian 10, et seulement en root en 11. Ca doit être un truc tout bête que mon incompétence Linux m’empêche de voir.
Je ne veux pas migrer sur la nouvelle machine ta t que ça ne fonctionne pas, ce script me donne la consommation de mes plus importants équipements électriques, PAC, ballon, four etc… Et si ça ne tourne pas, suivi de conso est dans les choux.
Merci d’avance si vous avez une idée

La grosse dif entre debian 10 et 11, c’est que python 2 n’est plus présent… . Il faut peut être adapter ton script a python 3 ?

Essayé aussi de mettre à jour la première ligne pour pointer vers python 3.9

… Et tu as bien installé la librairie pyemvue en tant que Root ?

Norbert

Ben avec ses infos je vois pas trop comment aider.

Le script fait appel a autre chose (le package pyemvue) qui retourne une erreur.

Donc sans avoir son code à lui, aucun moyen de répondre…

Le probleme de compatibilité est peut-être meme directement de son côté

A vu de nez c’est vraiment un problème de droits.

Essaye de faire une vérification/restauration des droits par jeedom.

Sinon connecte-toi avec le user www-data (log toi en ssh avec ton user ou root sur la machine, puis tape sudo -u www-data bash) et vérifie que tu peux bien éditer le fichier. (En passant, un chmod 664 devrait suffir)

Sinon vérifie que www-data est bien propriétaire du fichier et de tous les répertoires depuis /var/www (inclus)

Et donne nous le résultat de la commande ls -la dans le dossier de keys.json.

Es-tu sur que le chemin vers keys.json est bon ?
Pourquoi ne pas mettre un chemin absolu ici :

token = 'keys.json'

Hello merci à vous 3 pour les réponses
La bonne nouvelle si c’en est une c’est que si je lance le script avec

sudo /var/www/html/plugins/script/data/PyEmVue/PyEmVue.PY
Il s’exécute. Ca veut dire que c’est bien un problème de droits, non ?

@ngrataloup

Pour le un, je l’ai fait dans l’intervalle, mais ça n’a rien changé. Je ne comprends du reste pas à quoi ça sert, je croyais que toutes les lignes commençant avec # étaient du commentaire ?

Oui, oui, du reste ça me gêne à chaque fois car quand je lance :

python3 -m pip install "pyemvue"

J’ai un message que je ne devrais pas utiliser pip en root car ça peut poser des problèmes de droits. S’en suit une explication qu’il faut un environnement virtuel ou je ne sais quoi, c’est trop compliqué pour moi sans plus d’explications.

@Poumi

Moi je veux bien fournir les explications qu’on me demande, mais ce script n’est pas de moi, il fonctionne pour d’autres sous Jeedom, y compris sur des Luna en Debian 11, et fait partie d’un plugin HA. Donc je pense qu’il est bon.

@Bad

Ca je l’avais fait, sans résultat.

Désolé pour ma totale incompétence. Je ne comprends pas tout. Je ne sais pas ce qu’est le user www-data. Je me suis connecté en ssh. Avec root, je peux tout faire (heureusement). Avec mon utilisateur machine, disons jeedom1, je ne peux pas éditer les fichiers du répertoire PyEmVue, juste les visualiser.
Avec l’utilisateur Jeedom, disons Jeedom2 (donc différent de l’utilisateur machine), mais groupe administrateur, et depuis l’éditeur de fichier Jeedom, je peux à priori éditer tous les fichiers du répertoire :

J’ignore totalement comment on fait ça. J’ai essayé (après consultation du Web et association avec ta commande ci dessous) : ls -la -R, mais c’est tellement bavard que c’est quasi impossible de tout vérifier.
Y a-t-il une commande plus succinte ? Je n’ai pas trouvé.
Edit : Du coup, je l’ai fait chemin par chemin depuis le répertoire indiqué jusqu’à PyEmVue (donc en descendant de 1 dans la hiérarchie à chaque fois), et à chaque fois j’ai quelque chose du style :

drwxrwxr-x 2 www-data www-data 4096 30 mars  10:10  PyEmVue

En tous cas on retouve bien www-data à chaque fois

root@JeedomV:/var/www/html/plugins/script/data/PyEmVue# ls -la
total 20
drwxrwxr-x 2 www-data www-data 4096 30 mars  10:10 .
drwxrwxr-x 3 www-data www-data 4096 10 déc.   2021 ..
-rwxrwxr-x 1 www-data www-data 1869 30 mars  10:26 Emporia.PY
-rwxrwxr-x 1 www-data www-data 3915 30 mars  10:10 keys.json
-rwxrwxr-x 1 www-data www-data 1933 29 mars  14:01 PyEmVue.PY

J’avais fait ça aussi dans l’intervalle, mais c’était le même chemin sous la machine en Debian10…

Merci d’avance

Oui, tu as raison … sauf pour cette première ligne :wink:
Elle sert à dir eau systeme que ce n’ets pas un fichier binaire à executer mais un fichier texte de type script à executer avec l’interpreteur spécififé.

ca permet d’executer quand meme le script sans que l’interpreteur soit lancé en amont.
ex :
le fait de mettre #!/bin/sh en début d’un fichier permet de lancer le shell via « ./monshell.sh » plutôt que qu’en indiquant « sh monshell.sh »

Norbert