web-dev-qa-db-fra.com

Appeler Python dans PHP

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

Je ne veux pas avoir la moindre peine à installer mod_python ou mod_wsgi sur mon Mac. J'allais donc faire un system () ou un popen () depuis PHP pour appeler le script Python.

De meilleures idées? Merci d'avance!

73
Benny Wong

Selon ce que vous faites, system () ou 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 soit directement dirigée vers le navigateur. Utilisez popen () si vous souhaitez écrire des données sur l'entrée standard du script Python ou lire les données de la sortie standard du script Python en php. popen () ne vous laissera que lire ou écrire, mais pas les deux. Si vous voulez les deux, consultez proc_open () , mais avec une communication bidirectionnelle entre programmes, vous devez faire attention à éviter les blocages, chaque programme attendant que l'autre fasse quelque chose.

Si vous souhaitez transmettre les données fournies par l'utilisateur au script Python, il est important de faire attention à l'injection de commande. Si vous ne faites pas attention, votre utilisateur peut vous envoyer des données telles que "; evilcommand;" et faites que votre programme exécute des commandes arbitraires contre votre volonté.

escapeshellarg () et escapeshellcmd () peut vous aider, mais personnellement, j'aime supprimer tout ce qui n'est pas un bon personnage connu, en utilisant

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

L'opérateur backquote vous permettra également d'exécuter des scripts python en utilisant une syntaxe similaire à celle décrite 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;
25
user

Il y a aussi une extension PHP: Pip - Python dans PHP , que je n’ai jamais essayée, mais qu’il avait été marqué pour cette occasion

15
enobrev

Vous pouvez exécuter un script python via php et les afficher 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);

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

Pour que les codes complets fonctionnent, visitez Comment exécuter un script Python à partir de php et afficher le résultat sur navigateur

11
Idealmind

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

Faites particulièrement attention si votre serveur Web est ouvert à Internet au sens large. Veillez à supprimer votre entrée GET/POST dans ce cas afin de ne pas autoriser les attaquants à exécuter des commandes arbitraires sur votre ordinateur.

7
Eli Courtwright

Votre call_python_file.php devrait ressembler à ceci:

<?php
    $item='Everything is awesome!!';
    $tmp = exec("py.py $item");
    echo $tmp;
?>

Cela exécute le script python et renvoie le résultat au navigateur . Dans votre script python, la variable (sys.argv [1:]) importera tous vos arguments. Pour afficher le fichier argv sous forme de chaîne, quel que soit le lieu d'où tire votre php, si vous souhaitez créer une zone de texte:

import sys

list1 = ' '.join(sys.argv[1:])

def main():
  print list1

if __== '__main__':
    main()
2
Aze

Notez que si vous utilisez un environnement virtuel (comme dans l'hébergement partagé), vous devez ajuster votre chemin d'accès en python, par exemple: /home/user/mypython/bin/python ./cgi-bin/test.py

0
Bob3411

Les méthodes ci-dessus semblent être 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 contenant le bouton GO. 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

<html>
 <body>
  <head>
   <title>
     run
   </title>
  </head>

   <form method="post">

    <input type="submit" value="GO" name="GO">
   </form>
 </body>
</html>

<?php
    if(isset($_POST['GO']))
    {
        Shell_exec("python /var/www/html/lab/mkdir.py");
        echo"success";
    }
?>

mkdir.py

#!/usr/bin/env python    
import os    
os.makedirs("thisfolder");
0
Smshrimant