J'essaie d'exécuter un script Python à partir de PHP en utilisant la commande suivante:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Cependant, PHP ne produit tout simplement aucune sortie. Le rapport d'erreur est défini sur E_ALL et display_errors est activé.
Voici ce que j'ai essayé:
- J'ai utilisé
python2
,/usr/bin/python2
etpython2.7
au lieu de/usr/bin/python2.7
- J'ai également utilisé un chemin relatif au lieu d'un chemin absolu qui n'a rien changé non plus.
- J'ai essayé d' utiliser les commandes
exec
,shell_exec
,system
.
Cependant, si je cours
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
cela fonctionne parfaitement bien shutdown now
sans rien faire.
PHP a les autorisations pour accéder et exécuter le fichier.
EDIT: Grâce à Alejandro, j'ai pu résoudre le problème. Si vous rencontrez le même problème, n'oubliez pas que votre serveur Web ne fonctionnera probablement pas en tant que root. Essayez de vous connecter en tant qu'utilisateur de votre serveur Web ou en tant qu'utilisateur avec des autorisations similaires et essayez d'exécuter les commandes vous-même.
Réponses:
Testé sur Ubuntu Server 10.04. J'espère que cela vous aidera également sur Arch Linux.
En PHP, utilisez la fonction shell_exec :
Dans le fichier Python
test.py
, vérifiez ce texte en première ligne: (voir shebang expliquer) :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". De plus, toutes les commandes du
.py
fichier doivent avoir les privilèges corrects:Pris du manuel php :
Pour rendre exécutable un fichier sur des plates-formes de type Unix :
la source
echo shell_exec("/usr/local/bin/python3 /Users/cyborg/Dev/magic.py");
ou:echo shell_exec("/usr/bin/python /Users/cyborg/Dev/magic.py");
Je recommande d'utiliser
passthru
et de gérer directement le tampon de sortie:la source
Si vous souhaitez connaître l'état de retour de la commande et obtenir la
stdout
sortie complète, vous pouvez réellement utiliserexec
:$out
est un tableau de toutes les lignes.$status
est le statut de retour. Très utile pour le débogage.Si vous voulez également voir la
stderr
sortie, vous pouvez soit jouer avec proc_open, soit simplement ajouter2>&1
à votre fichier$command
. Ce dernier est souvent suffisant pour faire fonctionner les choses et bien plus rapidement pour «mettre en œuvre».la source
Alejandro l'a cloué, ajoutant une clarification à l'exception (Ubuntu ou Debian) - je n'ai pas le représentant à ajouter à la réponse elle-même:
fichier sudoers:
sudo visudo
exception ajoutée:
www-data ALL=(ALL) NOPASSWD: ALL
la source
Pour clarifier la commande à utiliser en fonction de la situation
exec()
- Exécuter un programme externesystem()
- Exécuter un programme externe et afficher la sortiepassthru()
- Exécuter un programme externe et afficher la sortie bruteSource: http://php.net/manual/en/function.exec.php
la source
Dans mon cas, j'avais besoin de créer un nouveau dossier dans le
www
répertoire appeléscripts
. Dansscripts
j'ai ajouté un nouveau fichier appelétest.py
.J'ai ensuite utilisé
sudo chown www-data:root scripts
etsudo chown www-data:root test.py
.Ensuite, je suis allé dans le nouveau
scripts
répertoire et utilisésudo chmod +x test.py
.Mon fichier test.py ressemble à ceci. Notez les différentes versions de Python:
Depuis php, je fais maintenant ceci:
Et vous devriez voir: Hello World!
la source
Les méthodes ci-dessus semblent complexes. Utilisez ma méthode comme référence.
J'ai ces deux fichiers:
run.php
mkdir.py
Ici, j'ai créé une page HTML qui contient un GO bouton. Chaque fois que vous appuyez sur ce bouton, un nouveau dossier est créé dans le répertoire dont vous avez mentionné le chemin.
run.php
mkdir.py
la source
C'est tellement trivial, mais je voulais juste aider tous ceux qui ont déjà suivi la suggestion d'Alejandro mais ont rencontré cette erreur:
Si quelqu'un a rencontré cette erreur, une petite modification doit être apportée au fichier php par Alejandro:
la source