Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lancer un script Python depuis PHP

    1 mai 2021 à 9:18:51

    bonjour,

    ça fait 2/3 jours que je galère sur ce sujet, alors j'ai décidé de poser ma question, j'espère qu'elle seras pertinente. Même si je sais qu'il existe deja des sujets sur cette question, ils n'ont pas permis de résoudre mon problème. C'est pour ça que je me permet de poser ce sujet ici. 

    Je suis débutant en php. Et en commençant un projet, j'ai fait un code qui gère ma bdd en python.

    Et j'aimerais que ce code python (qui est rangé au même endroit que mon code php) s'exécute au clique d'un bouton.

    Après avoir essayé, exec(), sehl_exec(), et j'en passe. Rien ne fonctionne à par que des fois le code python se supprime suite au clique du bouton.

    Mon code :

    <form action="" method="post">
    <button name="bouton" value="1" onclick = <?php exec("python creation_des_menu.py"); ?>>Changer le menu</button>
    </form>


    <?php

    if(isset($_POST["bouton"])){

    //exec('python C:\wamp64\www\Course>creation_des_menu.py');
    //$command = escapeshellcmd('python C:\wamp64\www\Course\creation_des_menu.py');
    //$command =escapeshellcmd("python C:\wamp64\www\Course\creation_des_menu.py");
    //exec($command);

    $command = shell_exec('python "C:\wamp64\www\Course\creation_des_menu.py" "r"');

    //header("Refresh:0");

    //include "creation_menu.php";

    //header("Refresh:0");

    }


    Je n'arrive vraiment pas à trouver, j'espère que quelqu'un pourras m'aiguiller et j'aurais besoin d'aide merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      1 mai 2021 à 10:15:50

      Bonjour, pourrais tu utiliser la coloration syntaxique stp.

      Et la de ce que je vois, ton code s'exécutera à l'affichage de la page. Car TOUT ton PHP est interprété avant l'affichage.

      Il faudrait que ce soit a la limite dans ton poste. Et ton script python il doit faire quoi ?

      • Partager sur Facebook
      • Partager sur Twitter
      $2b||!$2b
        1 mai 2021 à 10:42:38

        Pardon je n'avias pas compris comment ça fonctionné. 

        Mon code html /PHP : qui au clique du bouton doit lancer le script python mais ça ne fonctionne pas : 

        <form action="" method="post">
        <button name="bouton" value="1" type="submit"?>>Changer le menu</button>
        </form>


        Et la fonction appelé par le bouton (avec mes tentatives en commentaire mais rien ne fonctionne):

        if(isset($_POST["bouton"])){
                        
                        //exec('python C:\wamp64\www\Course>creation_des_menu.py');
                        //$command = escapeshellcmd('python C:\wamp64\www\Course\creation_des_menu.py');
                        //$command  =escapeshellcmd("python C:\wamp64\www\Course\creation_des_menu.py");
                        //exec($command);
        
                        $command = shell_exec('python "C:\wamp64\www\Course\creation_des_menu.py" "r"');
        
                        //header("Refresh:0");
        
                        //include "creation_menu.php";
        
                        //header("Refresh:0");
        
                    }


        Mon script python permet de faire un changement dans la base de donnée. Avez-vous besoin de plus d'information.

        Vu qu'il s'éxcute à l'affichage comment je peux faire autrement ? 

        -
        Edité par AntoineGillet11 1 mai 2021 à 11:40:04

        • Partager sur Facebook
        • Partager sur Twitter
          1 mai 2021 à 13:00:50

          Mon script python permet de faire un changement dans la base de donnée.

          Alors tu dois lui donner en entrée les paramètres pour qu'il fasse l'enregistrement. Tu es sûr que ce n'est pas plus simple de le faire directement en PHP ?

          • Partager sur Facebook
          • Partager sur Twitter
            2 mai 2021 à 10:13:38

            J'avoue que pour ce code python précisément il aurait été plus malin de le faire directement en PHP ; mais quand j'ai fait ce code j'étais plus à l'aise avec le python, mais c'était une erreur.

            Mais le problème n'est que reporté car j'ai un autre script python, qui n'est faisable que en python.

            Pour que mon projet réussisse je n'ai pas le choix d'arriver à lancer un script python depuis PHP.

            • Partager sur Facebook
            • Partager sur Twitter
              2 mai 2021 à 14:02:34

              Normalement, il faut juste faire un "exec" et ça fonctionne. Après il faut contrôler qu'il n'y a pas d'erreur, lors de l'exécution, etc.

              Je te laisse regarder la doc PHP de "exec" pour voir comment gérer les différents cas. Mais déjà, essaye de lancer ton script Python sur une page PHP vide avec uniquement ton exec voir déjà si ça fonctionne avant de tester de faire fonctionner sur un "onClick" etc

              • Partager sur Facebook
              • Partager sur Twitter
              $2b||!$2b
                2 mai 2021 à 15:21:16

                Mon programme python fonctionne correctement. Et j'ai regarder le doc exec, shell_exec, et un peu près tout je pense, mais impossible de le faire fonctionner.
                • Partager sur Facebook
                • Partager sur Twitter
                  2 mai 2021 à 19:48:45

                  Peux tu être plus précis stp. Il fonctionne correctement quand tu l'appel sur une page PHP vide ou bien il fonctionne dans ton terminal mais pas sur la page PHP vide ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                  $2b||!$2b
                    3 mai 2021 à 7:10:34

                    Bonjour,

                    Je me mêle du sujet ... 

                    1) pour mettre à jour une base de données, passer par un script python me semble 'anormal' donc le faire en php est la bonne méthode. Quelques arguments, tu empiles donc les process et les interpréteurs donc conso de ressources du serveur, faille de sécurité vraisemblablement, comment fais tu le retour avec le script php appelant car si tu lis bien la doc :

                    https://www.php.net/manual/fr/function.shell-exec.php

                    Cette fonction peut retourner null lorsqu'une erreur survient mais aussi lorsque le programme ne produit aucune sortie. Il n'est pas possible de détecter les échecs d'exécution en utilisant cette fonction. La fonction exec() doit être utilisée lorsque vous souhaitez récupérer le code de sortie de votre programme.

                    2) J'aimerai bien savoir quelle fonction n'est faisable qu'en python ? Ayant développé un site un peu atypique et très complet de domotique, je n'ai jamais eu besoin d'un autre langage que php (symfony).

                    A+

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 mai 2021 à 10:19:15

                      @monkey3d: Je suis bien d'accord avec toi. Je voulais attendre que son code fonctionne avant de lui poser la question (même s'il supprime après son code ça pourrai lui servir peut être un jour pour sa culture perso)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      $2b||!$2b
                        3 mai 2021 à 14:51:57

                        Bonjour monkey3d, 

                        C'est sur que c'est anormal, et non conventionnelle. Et je l'ai maintenant re coder en PHP sans problème. Mais il me reste un code python qui me parais  utilisable quand python (je me montre probablement) car j'utilise plusieurs bibliothèque python que je n'ai pas trouvé un php. Dont Sélénium mais que j'ai vu compatible en PHP, mais pas comme je le voulais.  

                        "Quelques arguments, tu empiles donc les process et les interpréteurs donc conso de ressources du serveur, faille de sécurité vraisemblablement, comment fais tu le retour avec le script php appelant car si tu lis bien la doc :" 

                        Je n'ai pas tout compris le début, mais je n'ai pas besoin de faire un retour sur le code PHP. Le script python change 14 variables de la base de données aléatoirement. Et c'est toujours les mêmes donc aucune communication n'est nécessaire. J'ai juste besoin de l'exécuter et je suis sur qu'il fonctionne. (Mais je l'ai maintenant converti en php donc plus besoin de le lancer)

                        Mais le 2ême qui automatise un process sur un site, j'aimerais pouvoir le lancer en python (mais pareil il est 100% autonome il a juste besoin d'être lancé) . 

                        Vous pensez que c'est possible ? 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 mai 2021 à 18:49:37

                          La migration en php pour sauvegarder des données est une bonne chose.  :D

                          Pour ré-expliquer en très raccourci ce que tu fais en lançant à partir de php un script python : tu as le process php qui lance l'interpréteur python qui lance le programme python qui lance sans doute encore d'autres choses ... bref conso mémoire, cpu, etc par rapport à une solution directe en php : donc pas bonne pratique.

                          Autre point : dans un développement sérieux, on regarde toujours l'aboutissement d'une fonction, d'un process, etc. Donc avec ta réponse, je comprends que si ton process python échoue (alors tu vas me répondre que ce n'est pas possible ... mais bien-sûr que si !) php n'en sait rien et continue comme si cela s'était bien déroulé : mauvaise pratique.

                          Bien-sur que c'est possible de lancer du python à partir de php : rassuré, j'espère ?

                          Peux-tu mettre le chemin complet de l'interpréteur python dans la commande car je ne suis pas sûr que apache connaisse le path complet de la commande python ?

                          Et j'aimerai bien savoir fonctionnellement (pas de code) ce qui n'est pas faisable dans ton second script python via le langage php ?

                          A+

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mai 2021 à 12:35:18

                            Mon script php lance mon script python et c'est tout. 

                            Les deux ne communique pas mais :

                             -Le premier est lié par la base de donnée, donc si une erreur survient le script php pourrais le savoir sans problème. Mais il n'y a plus de soucis car maintenant il est en php vu que j'ai écouté vos conseil.

                            -Le deuxième lance une interface utilisateur donc si ça ne fonctionne pas, ça serais exactement le même problème en php.

                            Bien sur que je suis rassuré, car j'ai l'impression que ce n'est pas si simple vu qu'on est encore dessus. Même si grâce a notre discussion je commencerais mon prochain projet autrement, et je vous remercie pour vos conseils, et votre patience. 

                             $comand = 'c:/wamp64/www/Course/Python_code/creation_des_menu.py';
                             $python = 'C:/Users/ant1g/AppData/Local/Microsoft/WindowsApps/python.exe';
                             echo "$python $comand";
                             var_dump(exec("$python $comand", $output));
                             var_dump($output); 

                            J'ai donc essayé comme ça, mais rien ne fonctionne

                            Fonctionnellement parlant, il n'y a peut-être pas de raison que ça fonctionne pas. Mais impossible de trouver la bibliothèque en php. Et surtout aucune documentation en php.

                            • Partager sur Facebook
                            • Partager sur Twitter
                              4 mai 2021 à 13:18:16

                              Je ne suis pas certains de comprendre ce que font tes scripts python. Peux tu être un petit peu plus clair ?

                              Mais du coup, si un de tes scripts lance une interface, on est d'accord que ton projet sera hébergé sur un serveur où tu ne pourras pas lancer d'interface, right ? Sauf si c'est que pour du local. Mais pour l'instant il n'y a rien de ce que tu as dit qui ne peux pas être fait en PHP/HTML/CSS/JS.

                              • Partager sur Facebook
                              • Partager sur Twitter
                              $2b||!$2b
                                4 mai 2021 à 13:54:10

                                Mon script python lance une autre interface web, mais je pourrais l'héberger je pense. Mais pour le moment c'est pour l'utiliser en local. 

                                Mon seul soucis pour finir mon projet c'est de pouvoir le lancer depuis PHP, mais je n'y arrive pas

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  4 mai 2021 à 14:35:14

                                  Salut

                                  Est-ce que le retour de exec ne contiendrait pas, d'une manière ou d'une autre, les informations de pourquoi ça ne fonctionne pas ?

                                  A noter que sous Windows, les parties de chemins sont séparées par des antislashes \, et non des slashes /. PHP et Apache se débrouillent quand ils les utilisent directement parce que tu utilises du Windows, mais là tu tentes de faire lancer plus ou moins à l'aveugle une commande Windows avec une syntaxe Linux…

                                  Sinon, je t'avouerai avoir aussi l'impression que tu veux faire un trajet du canapé du salon au fauteuil en passant par le supermarché du coin en voulant "lancer une autre interface web" par ligne de commandes Python depuis un script PHP. Je pense que je n'ai pas toutes les informations qui expliquent le nécessaire pour faire un tel détour.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    4 mai 2021 à 16:02:48

                                    voici le retour que j'arrive a avoir avec mon exec() : 

                                    C:\wamp64\www\Course\index.php:44:string '' (length=0)
                                    C:\wamp64\www\Course\index.php:46:
                                    array (size=0)
                                      empty

                                    Je ne sais pas si ça pourras vous aider. Je vais essayer avec d'autre manière mais je ne crois pas que ça fonctionne.

                                    -
                                    Edité par AntoineGillet11 4 mai 2021 à 16:03:27

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 mai 2021 à 16:07:17

                                      Tu as bien changé tes chemins, en remplaçant les caractères dont j'ai parlé ?

                                      -
                                      Edité par Ymox 4 mai 2021 à 16:07:33

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        5 mai 2021 à 7:08:29

                                        Si j'ai bien compris ... Il me semble que tu as un problème d'architecture global car, pour faire simple, tu ne peux lancer une interface générée par python dans un projet en architecture web.

                                        Tu voudrais la lancer où d'ailleurs ? sur le serveur (en local comme tu dis) ou sur les différents postes clients où sont situés les navigateurs (car c'est quand même le but d'un projet web) ? Voir aussi remarque de skuti ci-dessus.

                                        D'ailleurs si tu veux lancer en local, pourquoi dans ce cas faire une architecture web ?

                                        Sans doute veux tu lancer le script python pour t'éviter de refaire l'interface en HTML/CSS voire javascript ... mais c'est pourtant la solution. 

                                        Et pour répondre à : "mon script lance un script python c'est tout" ... si c'était aussi direct ! Tu peux te douter que ta machine ne peut exécuter du langage python directement. Donc et en faisant très simple ... il faut déjà lancer l'interpréteur python : c'est le début de ta commande dans le exec ... donc quelques process de la mémoire des IO des sémaphores ... Ensuite le script python dont on ne sait ce qu'il fait sinon de générer une interface .. donc sans doute là-aussi chargement de bibliothèques etc. Bref un empilement de couches nuisibles aux performances de la machine et dont tu conviens toi-même que tu as des difficultés à remonter les informations du python vers php ... donc en fin de compte vers l'utilisateur.

                                        Ne le prends pas mal car je ne veux pas être désagréable mais je laisse le sujet car au-delà de la question particulière du lancement d'un process externe par du php qui est faisable (les primitives existent), la viabilité de ton architecture me semble compromise pour les raisons exposés ci-dessus.

                                        Bye

                                        -
                                        Edité par monkey3d 5 mai 2021 à 7:11:51

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          5 mai 2021 à 9:28:03

                                          Merci de ton explication, que je comprend complétement. 

                                          Pourquoi me faire attendre 4 jours, avant de dire que php ne peut pas lancer de script python. 

                                          Car désolé mais tout de suite, les seuls raisons que vous me donnez sont des soucis de performance qui ne regarde que moi. 

                                          Mais vous avez été incapable de me proposer des solution fiable: "Bien-sur que c'est possible de lancer du python à partir de php : rassuré, j'espère ?" finalement moyen rassuré mais bon.

                                          Merci d'avoir passé tant de temps sur ce problème, même si c'est pour le laisser sans solutions

                                          Bye 

                                          $comand = 'C:\\wamp64\\www\\Course\\Python_code\\creation_des_menu.py';
                                                          $python = 'C:\\Users\\ant1g\\AppData\\Local\\Microsoft\\WindowsApps\\python.exe';
                                          $comand = 'C:\wamp64\www\Course\Python_code\creation_des_menu.py';
                                                          $python = 'C:\Users\ant1g\AppData\Local\Microsoft\WindowsApps\python.exe';

                                          Désolé de mon temps de réponse Ymox, rien de tout ça ne fonctionne 

                                          -
                                          Edité par AntoineGillet11 5 mai 2021 à 9:38:34

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            5 mai 2021 à 10:03:33

                                            PHP peut lancer des scripts python. Mais pour les raisons de performances évoquées, peu se tournent vers cette solution. Du coup, peu se frottent aux problèmes que ça pose (droits d'exécution notamment). Et sans essayer nous-même, c'est pas simple. Je ne travaille pas avec Python, donc je n'ai aucun moyen de tester, et n'ai pas vraiment la motivation de le faire juste pour t'aider, désolé si ça paraît égoïste.

                                            Je sais cependant que tu n'es pas le premier à poser des questions à ce propos sur ce forum, je pars du principe que tu es allé voir les autres sujets. Aucun ne fournit de meilleure piste ?

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              5 mai 2021 à 11:30:11

                                              Bonjour. Je ne suis pas spécialiste de ce type de commande, mais tu as une série de fonctions que tu peux exploiter en PHP :

                                              exec()
                                              passthru()
                                              escapeshellcmd()
                                              pcntl_exec()

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                5 mai 2021 à 17:36:30

                                                Je reviens quand même car oui php peut lancer un programme externe donc du python qui lance un script ... Je l'ai fait pour tester il y a quelques temps.

                                                Le problème de performance que j'ai souligné c'est juste que ce n'est pas optimale - loin s'en faut - comme architecture logicielle.

                                                Mais ton problème, c'est que tu veux lancer un script python qui génère une interface dans une architecture web ... et là je te dis que ce n'est pas possible. Dans une architecture web c'est le navigateur qui gère l'interface.

                                                Donc c'est peut-être pour cela que tu n'obtiens pas le résultat.

                                                Et le fait que tu veuilles créer une interface, ce n'est pas depuis le début de cette conversation que nous le savons.

                                                Pour info j'ai retrouvé le code de mon test de 2018 qui est fait avec Symfony 3.3 ( Symfony étant un framework php) pour gérer un client mqtt. Mais comme je l'ai dis à plusieurs reprises dans cette discussion c'est une mauvaise architecture logicielle donc j'ai développé de suite pour la production le client mqtt en php.

                                                Tu peux aussi remarquer que le process php récupérait la sortie du script python ... ce qui permet d'évaluer si l'action s'est bien déroulée.

                                                $process = new Process(['/var/www/html/MHS/bin/mhsbin/PubWebSocket.py', $topic, $payload, $qos]);
                                                		// running processes asynchronously : https://symfony.com/doc/3.4/components/process.html
                                                		$process->start();
                                                		while ($process->isRunning()) {
                                                		}
                                                		$this->logger_domotique->notice(__FUNCTION__
                                                				." output du process : ".$process->getOutput()
                                                			);

                                                Et le début du script python :

                                                #!/usr/bin/env python3
                                                # encoding: UTF-8
                                                
                                                import json
                                                import paho.mqtt.client as mqtt
                                                import yaml
                                                import sys
                                                

                                                Bye


                                                -
                                                Edité par monkey3d 5 mai 2021 à 17:55:46

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Lancer un script Python depuis PHP

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown