Je recommande d'utiliser passthru
et gérer directement le tampon de sortie :
ob_start();
passthru('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
$output = ob_get_clean();
Testé sur Ubuntu Server 10.04. J'espère que cela vous aidera également sur Arch Linux.
En PHP, utilisez la fonction shell_exec :
Exécutez la commande via le shell et renvoyez la sortie complète sous forme de chaîne.
Il renvoie la sortie de la commande exécutée ou NULL si une erreur s'est produite ou si la commande ne produit aucune sortie.
<?php
$command = escapeshellcmd('/usr/custom/test.py');
$output = shell_exec($command);
echo $output;
?>
Dans le fichier Python test.py
, vérifiez ce texte en première ligne :(voir shebang expliquer) :
#!/usr/bin/env python
Si plusieurs versions de Python sont installées, /usr/bin/env garantira que l'interpréteur utilisé est le premier sur le $PATH de votre environnement. L'alternative serait de coder en dur quelque chose comme #!/usr/bin/python; c'est bien, mais moins flexible.
Sous Unix, un fichier exécutable destiné à être interprété peut indiquer quel interpréteur utiliser en ayant un #! au début de la première ligne, suivi de l'interpréteur (et des drapeaux dont il peut avoir besoin).
Si vous parlez d'autres plates-formes, bien sûr, cette règle ne s'applique pas (mais cette "ligne shebang" ne fait aucun mal et vous aidera si jamais vous copiez ce script sur une plate-forme avec une base Unix, telle que Linux, Mac, etc. ).
Cela s'applique lorsque vous l'exécutez sous Unix en le rendant exécutable (chmod +x myscript.py) puis en l'exécutant directement :./myscript.py,plutôt que simplement python myscript.py
Pour rendre exécutable un fichier sur les plateformes de type unix :
chmod +x myscript.py
De plus, le fichier Python doit avoir les privilèges corrects (exécution pour l'utilisateur www-data / apache si le script PHP s'exécute dans le navigateur ou curl) et/ou doit être "exécutable". Aussi toutes les commandes dans .py
le fichier doit avoir les privilèges corrects.
Extrait du manuel php :
Juste un petit rappel pour ceux qui essaient d'utiliser shell_exec sur une plate-forme de type aunix et qui n'arrivent pas à le faire fonctionner. PHP s'exécute en tant qu'utilisateur Web sur le système (généralement www pour Apache), vous devez donc vous assurer que l'utilisateur Web a des droits sur tous les fichiers ou répertoires que vous essayez d'utiliser dans la commande shell_exec. Sinon, il n'apparaîtra pas faire n'importe quoi.
Si vous souhaitez connaître l'état de retour de la commande et obtenir l'intégralité du stdout
sortie vous pouvez utilisez réellement exec
:
$command = 'ls';
exec($command, $out, $status);
$out
est un tableau de toutes les lignes. $status
est le statut de retour. Très utile pour le débogage.
Si vous voulez aussi voir le stderr
sortie, vous pouvez jouer avec proc_open ou simplement ajouter 2>&1
à votre $command
. Ce dernier est souvent suffisant pour faire fonctionner les choses et beaucoup plus rapide à "implémenter".