[Bloc code] Execution python depuis un bloc code php

Tags: #<Tag:0x00007fe317c6c620>

Bonjour,

J’aimerai exécuter un programme python à partir d’un bloc code PHP, voici le code :

$json = system('python /var/www/html/plugins/script/core/ressources/monscript.py arg1 arg2 arg3');

Mais cela tombe en erreur, message orange erreur dans le scénario (je ne trouve pas de log dans ce cas, je suis portant en debug dans configuration->log->log ).

une idée ?

peut’être donner des droits d’execution a « monscript.py »
et d’appeler directement le script (sans python devant)
cela supose aussi que le header de monscript.py spécifie la position et la version python …

#!/usr/bin/python

import .......

Si ca fonctionne pas tu peut toujours le lancer depuis un plugin-script !

Jette un oeil ici, à ‹ utilisation ›, tu a un exemple de bloc code

Bonjour,

Merci pour le retour, j’avais déjà fait l’ensemble de ces actions. J’avais pensé au plan B script, je voulais limiter les intermédiaires.

@kiboost : D’après ce que je comprends en fait c’est impossible d’exécuter des script python en l’état dans jeedom, il faut obligatoirement passer par ce module pyJeedom ou grâce à ce script on peut appeler des routings jeedom dans un script python ?

Non pas du tout, le module python permet de récupérer des paramètres depuis jeedom. Si tu a juste besoin de lancer un script python avec des arguments, tu n’a rien besoin d’autres. L’exemple est suffisamment parlant, sinon c’est que tu risque de tout casser :grin:

1 J'aime

Bonjour,

Non cela ne fonctionne pas avec la commande shell_exec

Voici mon code pyhton :

#!/usr/bin/python
import sys, socket

ip=(sys.argv[1])
port=int((sys.argv[2]))
SN=(sys.argv[3]).encode('utf-8')
msg= 'V3{"sn":"'+ SN + '","cmd":90}'
soc=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try :
 soc.sendto(msg, (ip, port))
 msgAndAddress = soc.recvfrom(1024)
 print(msgAndAddress[0].replace('V3',''))
except socket.error, msg:
 print "Error Code : " + str(msg[0]) + " message " + msg[1]
sys.exit()

1 ton script fonctionne t’il en dehors de jeedom ?
2 ton script a t’il bien des droit d’exécution
3 dans le repertoire du script peut tu faire un :
ls -al

4 a tu essayer de lancer ton script depuis le plugin-script ?

Regarde ici c’est peut’être le même genre de problème

Oui, il fonctionne par l’intermédiaire du plugin script, je voudrais éviter cet intermédiaire.

dans ton 1er post

argv1 2 3 sont des variables ou des valeurs en dur ?

en dur, la commande exacte est la suivante :

$json = system('python /var/www/html/plugins/script/core/ressources/monscript.py 192.XXX.X.XXX AAAA SWW');

a tu essayé d’executer directement le fichier.py

$json = system(’/var/www/html/plugins/script/core/ressources/monscript.py 192.XXX.X.XXX AAAA SWW’);

avec mon script.py avec des droits d’execution
peut tu faire
ls -al
dans le répertoire ou se trouve le script

voici :

-rwxrwxr-x 1 www-data www-data 906 mars 21 07:13 monscript.py

Ca me parait correct, ta fait le test sans le python dans la ligne a executer ?

pas mieux malheureusement, c’est bizarre que ça fonctionne pas

essai

$json = shell_exec(’/var/www/html/plugins/script/core/ressources/monscript.py 192.XXX.X.XXX AAAA SWW’);

Pas d’erreur dans le scenario par contre ne rempli pas la variable $json

je connais 2 méthodes décrites ici :
http://php.net/manual/en/function.shell-exec.php
http://php.net/manual/en/function.exec.php

plus celle que tu utilise mais a mon avis le retour de paramètres n’est pas comme tu le fait:
https://www.php.net/manual/en/function.system.php


<?php
echo '<pre>';

// Outputs all the result of shellcommand "ls", and returns
// the last output line into $last_line. Stores the return value
// of the shell command in $retval.
$last_line = system('ls', $retval);

// Printing additional info
echo '
</pre>
<hr />Last line of the output: ' . $last_line . '
<hr />Return value: ' . $retval;
?>

Je vous ai tous embêté pour rien c’est mon json_decode qui bug en faite.

Merci pour votre aide

bonne journée, ce qui compte c’est que ca fonctionne

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