87 votes

Appeler Python en PHP

J'ai un script Python que j'ai récemment écrit et que j'appelle en utilisant la ligne de commande avec quelques options. Je veux maintenant une interface web très fine pour appeler ce script localement sur mon Mac.

Je ne veux pas m'embêter à installer mod_python ou mod_wsgi sur mon Mac, donc j'allais juste faire un system() ou popen() depuis PHP pour appeler le script Python.

Une meilleure idée ? Merci d'avance !

113voto

Glomek Points 12183

Cela dépend de ce que vous faites, système() o popen() peut être parfait. Utilisez system() si le script Python n'a pas de sortie, ou si vous voulez que la sortie du script Python aille directement dans le navigateur. Utilisez popen() si vous voulez écrire des données dans l'entrée standard de Python script, ou lire des données de la sortie standard de Python script en php. popen() vous permettra seulement de lire ou d'écrire, mais pas les deux. Si vous voulez les deux, consultez proc_open() Mais avec une communication bidirectionnelle entre les programmes, il faut veiller à éviter les blocages, où chaque programme attend que l'autre fasse quelque chose.

Si vous voulez transmettre des données fournies par l'utilisateur au script Python, il faut faire attention à l'injection de commandes. Si vous ne faites pas attention, votre utilisateur pourrait vous envoyer des données comme " ; evilcommand ;" et faire en sorte que votre programme exécute des commandes arbitraires contre votre volonté.

escapeshellarg() y escapeshellcmd() peut aider à cela, mais personnellement j'aime supprimer tout ce qui n'est pas un bon caractère connu, en utilisant quelque chose comme

preg_replace('/[^a-zA-Z0-9]/', '', $str)

1 votes

Le module subprocess a remplacé l'utilisation directe de os.Popen[n]. Vous devriez l'utiliser à la place.

6 votes

@Nick Stinemates : Nous parlons de fonctions PHP ;)

0 votes

N'y a-t-il pas de solution qui n'implique pas un shell, comme execve() en C sauf qu'il s'exécute sur un processus séparé au lieu de devoir fork() d'abord.

30voto

user1234567890 Points 234

L'opérateur de citation inverse vous permettra également d'exécuter des scripts python en utilisant une syntaxe similaire à celle ci-dessus

Dans un fichier python appelé python.py :

hello = "hello"
world = "world"
print hello + " " + world

Dans un fichier php appelé python.php :

$python = `python python.py`;
echo $python;

15voto

enobrev Points 10306

Il existe également une extension PHP : Pip - Python en PHP que je n'ai jamais essayé mais que j'avais mis dans mes favoris pour une telle occasion.

13 votes

Attention, le nom "pip" est aussi utilisé pour décrire l'outil de gestion de paquets Python, extrêmement populaire et assez standard, donc c'est un nom vraiment mauvais, confus et condamné pour cet outil PHP. C'est peut-être pour cela qu'il n'a pas été mis à jour depuis si longtemps.

2 votes

On dirait qu'il est toujours en activité (sans le mauvais choix de nom). github.com/jparise/php-python

13voto

Idealmind Points 506

Vous pouvez exécuter un script python via php, et les sorties sur le navigateur.

En gros, vous devez appeler le script python de cette façon :

$command = "python /path/to/python_script.py 2>&1";
$pid = popen( $command,"r");
while( !feof( $pid ) )
{
 echo fread($pid, 256);
 flush();
 ob_flush();
 usleep(100000);
}
pclose($pid);

Note : si vous exécutez un time.sleep() dans votre code python, les résultats ne seront pas affichés sur le navigateur.

Pour connaître tous les codes en vigueur, visitez Comment exécuter python script à partir de php et afficher la sortie sur le navigateur

0 votes

Comment spécifier le chemin ici relatif et absolu. En gros, j'ai mon python script présent sous disons le dossier tempmon et le même dossier contient mon python script. Je veux que l'application soit portable et je peux donc simplement copier le fichier tempmon sous le dossier htdocs . Et la même chose devrait fonctionner sur différentes machines.

0 votes

Cela a parfaitement fonctionné. Vous pouvez ajouter les balises php d'ouverture et de fermeture <?php ?> pour une meilleure compréhension pour les débutants.

7voto

Eli Courtwright Points 53071

Je fais tout le temps ce genre de choses pour des scripts rapides et simples. Il est assez courant d'avoir un CGI ou un script PHP qui utilise simplement system/popen pour appeler un programme externe.

Soyez très prudent si votre serveur web est ouvert à l'Internet en général. Veillez à désinfecter vos entrées GET/POST dans ce cas afin de ne pas permettre aux attaquants d'exécuter des commandes arbitraires sur votre machine.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X