L'exécution d'un script Python à partir de PHP
Je suis en train de lancer un script Python à partir de PHP à l'aide de la commande suivante:
exec('/usr/bin/python2.7 /srv/http/assets/py/switch.py arg1 arg2');
Toutefois, PHP n'est pas simplement de produire une sortie. Rapport d'erreur est défini à E_ALL et display_errors est sur.
Voici ce que j'ai essayé:
- J'ai utilisé
python2
,/usr/bin/python2
etpython2.7
au lieu de/usr/bin/python2.7
- J'ai aussi utilisé un chemin d'accès relatif au lieu d'un chemin d'accès absolu qui n'a rien changé non plus.
- J'ai essayé d'utiliser les commandes
exec
,shell_exec
,system
.
Cependant, si je lance
if (exec('echo TEST') == 'TEST')
{
echo 'exec works!';
}
il fonctionne parfaitement bien, tout shutdown now
ne pas faire n'importe quoi.
PHP dispose des droits nécessaires pour accéder et exécuter le fichier.
EDIT: Merci à Alejandro, j'ai été en mesure de résoudre le problème. Si vous avez le même problème, n'oubliez pas que votre serveur probablement/nous l'espérons ne pas exécuter en tant que root. Essayez de vous connecter à votre serveur d'utilisateur ou un utilisateur disposant des autorisations similaires et essayez d'exécuter les commandes vous-même.
Vous devez vous connecter pour publier un commentaire.
Testé sur Ubuntu Server 10.04. J'espère que cela vous aide également sur Arch Linux.
En PHP utilisation de la fonction shell_exec:
Dans le fichier Python
test.py
, vérifiez ce texte en première ligne: (voir le shebang expliquer):Aussi fichier Python doit avoir des privilèges appropriés (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 en
.py
fichier doit avoir des privilèges appropriés:Pris de manuel php:
À rendre exécutable un fichier sous unix de type plates-formes:
Je recommande d'utiliser
passthru
et de la manipulation de la mémoire tampon de sortie directement:Si vous voulez connaître l'état de retour de la commande et l'intégralité du
stdout
de sortie vous peut réellement utiliserexec
:$out
est un tableau de toutes les lignes.$status
est l'état de retour. Très utile pour le débogage.Si vous aussi vous souhaitez voir le
stderr
de sortie vous pouvez jouer avec de proc_open ou tout simplement ajouter2>&1
à votre$command
. Ce dernier est souvent suffisant pour obtenir des choses de travail et de façon plus rapide à "mettre en œuvre".Alejandro cloué, en ajoutant des précisions à l'exception (Ubuntu ou Debian) - je n'ai pas de rep pour ajouter à la réponse elle-même:
sudoers:
sudo visudo
exception ajouté:
www-data ALL=(ALL) NOPASSWD: ALL
De clarifier la commande à utiliser en fonction de la situation
exec()
- Exécuter un programme externesystem()
- Exécuter un programme externe et affiche la sortiepassthru()
- Exécuter un programme externe et l'affichage de la sortie rawSource: http://php.net/manual/en/function.exec.php
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
.Puis je suis allé à la nouvelle
scripts
répertoire et utilisésudo chmod +x test.py
.Mon test.py fichier qui ressemble à ça. Remarque les différentes version de Python:
À partir de php que je fais maintenant à ceci:
Et vous devriez voir: Bonjour tout le Monde!
Les méthodes ci-dessus semblent être complexe. Utiliser 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 ALLER bouton. Chaque fois que vous appuyez sur ce bouton, un nouveau dossier sera créé dans le répertoire dont le chemin d'accès que vous avez mentionnés.
run.php
HTML:
mkdir.py
C'est tellement trivial, mais je voulais juste aider quelqu'un qui a déjà suivi le long de Alejandro de la suggestion, mais rencontre cette erreur:
Si quelqu'un a rencontré cette erreur, alors un peu de changement doit être fait pour le fichier php par Alejandro: