Directive #! /usr/bin/python3 ignorée

Bonjour Mips

Je n’utilise qu’un seul script en python pour le calcul azimut et élévation de la lune: PyEphem
Celle-ci existe et n’existera qu’en python 2

  • Forcer l’exécution par python3 n’est donc pas la bonne solution.
  • Le gérer par une config global au plugin n’est pas non plus une solution: certaines commandes seront en python 2 d’autre en 3

Maintenir les quelques lignes que j’ai proposé d’ajouter ne devrait pas être un pb. C’est déjà compatible python4 :innocent:

Sinon j’avais aussi proposé d’utiliser l’extension .py3

Salut

Je ne suis pas un programmeur, mais j’avais cru que la première ligne d’un programme Python était là pour justement indiquer le type de Python du programme qui suivait.

Antoine

1 « J'aime »

C’est uniquement quand la commande est exécutable et est exécutée en direct et pas en argument de python/python3.
La 1ere ligne donne le python à exécuter.

C’est vrais Antoine et c’est justement ce que jeedom ne prend pas la peine de lire …

C’est exactement cela.
Dans ce cas, n’est-il pas possible de simplement exécuter le script sans appeler python?
je n’ai pas testé via un com_shell, mais peut-être qu’il n’y a pas besoin de spécifier python ./script.py mais qu’on peut juste exécuter ./script.py comme on le ferait en bash?

Parce que qu’une app lise la première ligne du fichier pour ensuite décider quel python lancer, ce n’est justement pas le principe et commencer à parser des strings c’est un risque de créer des bugs à mon avis, et là ca sera la responsabilité de jeedom car on fait quelque chose qui n’est pas standard.

Il manque alors juste la vérification si le .py est exécutable. is_executable()

A vérifier mais il me semble que le plug-in rend le fichier exécutable à la création (770 dans le fichier Ajax de mémoire)

En tous cas a la 1ere sauvegarde faite tout repasse en -rwxrwxr-x 775

Le fichier est bien créé en 770.
La 1ère ligne avec #!/usr/bin/python3 ou #! /usr/bin/python devient obligatoire. Sinon à la sauvegarde du script:


Message identique lors de l’exécution dans une console.

Si le fichier n’est pas executable, le message d’erreur est :

Si la commande dans l’entête du fichier est incorrecte ( python4 dans mon exemple )
image

Et comme il existe des pythons sans shebang, le plugin script doit ouvrir le fichier.py pour y vérifier l’existence et lancer le fichier avec ou sans python au début de la ligne de commande.

Oui évidement, j’étais distrait en proposant ça…

@jpty @Salvialf @Mips

Bon vous m’avez empêché de dormir :wink:

Mais c’est pas grave …

En faite le plugin n’est pas si mal écrit que ça c’est plutôt sa documentation qui aide pas dans cette affaire.

Si l’on regarde bien le code de la classe sur la partie case ‹ script ›.

case 'script':
if($this->getType() == 'info' && isset(script::$_requet_cache[$request])){
$result = script::$_requet_cache[$request];
}else{
if (strpos($request, '.php') !== false) {
$request_shell = new com_shell('php ' . $request . ' 2>&1');
} elseif (strpos($request, '.rb') !== false) {
$request_shell = new com_shell('ruby ' . $request . ' 2>&1');
} elseif (strpos($request, '.py') !== false) {
$request_shell = new com_shell('python ' . $request . ' 2>&1');
} elseif (strpos($request, '.pl') !== false) {
$request_shell = new com_shell('perl ' . $request . ' 2>&1');
} 

else {$request_shell = new com_shell($request . ' 2>&1');}

Après avoir tester tout un tas d’extension possible le else final tente simplement d’exécuter le fichier.

Il est donc très simple d’enlever l’extention .py au script pour qu’il soit executer

un détail, ne pas oublier la directive en première ligne du script

#!/usr/bin/env python3

qui dans cet exemple exécutera du python3.

Faut t’il qu’il soit exécutable … 3 solutions.

1 passer par l’éditeur du plugin-script au moment de la sauvegarde des droits d’exécution sont donnés
2 attendre ou lancer une sauvegarde
3 utiliser chmod chown

Bon je vous laisse le PHP et retourne finir ma nuit avec mon python :wink:

PS : Faudrait faire une correction de la documentation pour spécifier cette possibilité.

3 « J'aime »

Bonjour @olive

Oui sans extension, ça va fonctionner.
Toutefois je ne suis pas fan des fichiers sans extension qu’il faut ouvrir pour voir ce qu’ils contiennent.
Un double-clic dessus suffit pour l’éditer.
( J’utilise l’explo de Windows qui ne se base que sur l’extension pour déterminer le type de fichier. )

Pour les chmod, chown, il y a sur la page http://jeedom/index.php?v=d&p=administration#ostab
image qui fait des chmod 775
Le plus complet est le shell script health.sh accessible sur la même page par:
image
image qui fait les chown et chmod

Je préfére une solution de ce type qui conserve l’extension .py, qui reste compatible avec l’existant puisqu’elle vérifie si c’est exécutable et si le shebang est présent dans le fichier:

       elseif (($posPy=strpos($request, '.py')) !== false) {
          // suppression des arguments de la commande (apres .py)
          $file = trim(substr($request,0,$posPy)) .'.py';
          if(is_executable($file)) {
            $f = file($file);
            // recherche si la 1ere ligne contient #!
            if($f !== false && strpos($f[0],'#!') !== false) {
              $request_shell = new com_shell($request . ' 2>&1');
            }
            else {
              $request_shell = new com_shell('python ' . $request . ' 2>&1');
            }
          }
          else { // non executable lancement comme avant modif
            $request_shell = new com_shell('python ' . $request . ' 2>&1');
          }
        }

J’espère ne pas t’avoir réveillé trop tôt.

Rien ne t’empêche de mettre une extension qui ne soit pas dans la liste.
fichier.python3 par exemple …

Déjà réveillé !

Mauvais exemple, il y a .py dans l’extension que tu proposes.
Avec une extension kivabien, ça fonctionne.
Le mieux est l’extension .PY (en majuscules)

Bien mais ta solution nécessite la modification du fichier classe de script.
Et avant que ça arrive l’eau va encore couler sous les ponts …
donc restons simple. et si ton windaube veut des extensions il y a pleins de choix possible …

Toute cette sélection par extensions n’apporte rien que des problème il n’y aurait que moi je serait pour la suppression puisque a la sortie de l’éditeur du script tout sera de toute façon executable.

1 « J'aime »

Bonjour à tous.

Voici donc qui répond à la question que je me pose (et qui me tenait en échec) depuis longtemps : pourquoi mes scripts fonctionnent lorsqu’ils sont lancés en direct sur la console et non avec le plugin script ? Parce qu’ils sont écrits en Python 3 !

Comme dit, plus haut, il est en effet temps d’y remédier car Python 2.x va devenir obsolète. Je suis bien incapable de m’y pencher mais je ne doute pas que les développeurs du plugin se pencheront sur le sujet tôt au tard.

@olive : tu évoquais une solution de contournement ?

D’autres idées ?

Merci pour votre aide.

Oui ne pas mettre d’extension a ton script et ne pas oublier la directive :

#!/usr/bin/env python3

Oui, j’ai essayé aussi. Mais le script appelle des modules qui sont un peu partout dans le dossier. Alors certes il se lance, mais il s’arrête très vite…
Tu parlais d’une commande shell ?

ben positionne tes modules dans le même répertoire que ton script …
le shell reviens au même (c’est ce que fait plugin-script) sauf que si il y a « .py » quelque part il te lance du pyhthon2 donc la soluce est de ne pas avoir une occurrence reconnue

.pxy si tu veut

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