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.
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 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.
Si la commande dans l’entête du fichier est incorrecte ( python4 dans mon exemple )
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.
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
PS : Faudrait faire une correction de la documentation pour spécifier cette possibilité.
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. )
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');
}
}
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.
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 ?
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