Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exécuter un script python en back-end

    31 janvier 2023 à 19:11:55

    Bonjour à tous,

    J'ai essayer de fouiller le net mais je n'arrive pas à trouver la réponse à ma question. Pour l'un de mes projets, j'ai un programme python qui se connecte à une API et qui modifie une base de données. Ensuite j'ai un code PHP qui ne connecte à cette même base de données et qui m'affiche son contenu sur une page web.

    J'ai vu plusieurs fois que je pouvais combiner les deux en utilisant la commande exec (par exemple) sur dans mon PHP sauf que celle-ci ne fonctionne pas. J'aurais donc voulu savoir s'il était possible que au chargement de ma page web j'exécute le code python puis que le PHP affiche le contenu de la table de ma BDD ?

    J'espère avoir été assez clair dans mes explications.

    Merci de votre attention.

    -
    Edité par GabinSerrurot1 31 janvier 2023 à 19:12:10

    • Partager sur Facebook
    • Partager sur Twitter
      31 janvier 2023 à 20:08:54

      Bonjour,

      Déjà pourquoi faire simple quand on peut faire compliquer ?

      Ensuite, tu as pas réussi à exécuter du python à partir d'un code PHP, si je comprends bien... du coup quelle est l'erreur renvoyée ?

      À mon sens je ne vois rien qui pourrait empêcher de faire cela si les deux fichiers PHP et Python se trouve localement au même endroit.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        31 janvier 2023 à 20:31:24

        Merci pour la réponse.

        Alors déjà le projet en question est un projet scolaire dans lequel il n'y a pas forcément d'obligation de connecter le .py et le .php donc pour ceci je peux faire sans. Mon enseignant a un site à lui dans lequel il a un script python qui gère le back-end et je n'ai jamais eu trop l'occasion de lui demander à lui comment il fait ça. J'aurais voulu réutiliser le code python qu'on a fait en TP pour mon site à moi pour le faire sur mon site mais si tu as une solution plus simple je suis preneur (en en apprentissage, puisque je pose une question sur un forum...).

        Le problème est là. Malgré que j'ai activé l'affichage des erreurs en php, il ne m'en affiche aucune.

        <?php echo exec('python combinaison.py');?>

        Voici le code php au cas où l'erreur viendrait de ma commande ? Les deux fichiers sont dans le même répertoire. J'ai essayé avec et sans le echo au cas où mais rien n'y fait.

        -
        Edité par GabinSerrurot1 31 janvier 2023 à 20:31:54

        • Partager sur Facebook
        • Partager sur Twitter
          31 janvier 2023 à 20:46:57

          L'API n'est pas censé renvoyer quelque chose ?

          Si combinaison.py appelle l'API, il y a sans doute la réponse du serveur, sauf que dans ton cas tu n'as pas l'air d'enregistrer cela quelque part (une variable ?) ...

          Ça peut amener à savoir ce qui ne convient pas au serveur.

          C'est une requête POST, GET, UPDATE ?

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            31 janvier 2023 à 21:01:36

            L'API renvoie un fichier json et je l'utilise dans le fichier python. En fait à la base le fichier combinaison.py requête l'API, se connecte à ma base de données, certains champs du retour sont enregistrés dans cette base de données et c'est tout pour lui. Le problème est que quand je met le code que j'ai fournis dans mon message précédent, le chargement de ma page se passe nickel mais ma base de données ne se met pas à jour.

            Il s'agit d'une requête GET utilisée par le module 'requests' de python.

            • Partager sur Facebook
            • Partager sur Twitter
              31 janvier 2023 à 21:04:36

              Mais tu utilises une requête POST pour modifier ta base de données depuis ton script python ? Parce-que GET permet juste de récupérer des données...
              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                31 janvier 2023 à 21:07:16

                Pour modifier ma base de données j'utilise une connexion avec le module 'mysql.connector'.
                • Partager sur Facebook
                • Partager sur Twitter
                  31 janvier 2023 à 21:12:12

                  tu te connectes en local sur ta base de données ? Je comprends plus rien...
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                    31 janvier 2023 à 21:17:29

                    Nan je me connecte avec mes informations habituelles. En gros sur mon serveur je peux faire l'exécution du fichier python puis recharger ma page php mais je ne peux pas lier les deux.

                    Peut-être qu'il y a quelque chose qui m'échappe et je m'en excuse si c'est le cas. Sachant que les deux fichiers sont sur le serveur de mon établissement qui a python d'installé,  puisque je peux exécuter mon script python sans problèmes on est bien d'accord que je devrais pouvoir utiliser la commande exec sans problèmes ?

                    -
                    Edité par GabinSerrurot1 31 janvier 2023 à 21:22:16

                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 janvier 2023 à 21:40:44

                      oui c'est ça, si le script fonctionne correctement séparément, alors c'est que le problème vient du code PHP.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        31 janvier 2023 à 21:51:16

                        Alors là c'est un gros problème parce que mon script php en entier est le suivant :

                        <?php
                            exec('python combinaison.py');
                        
                            $bdd = new PDO('mysql:host=localhost; dbname=root; charset=utf8', 'root', 'mdp');
                            $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                        
                            $reponse = $bdd->query("SELECT * FROM api_poleemploi"); 
                            while ($donnees = $reponse->fetch()){
                                echo('<hr>');
                                echo('<br>');
                                echo("Numéro de l'annonce dans la BDD : ");
                                echo $donnees['id'];
                                echo('<br>');
                                echo('Intitulé : ');
                                echo $donnees['intitule'];
                                echo('<br>');
                                echo('Commune : ');
                                echo $donnees['commune'];
                                echo('<br>');
                                echo('Description : ');
                                echo $donnees['description'];
                                echo('<br>');
                                echo('<br>');
                            }
                            echo('<br>');
                            $reponse->closeCursor();
                        
                            $bdd = null;
                        ?>

                        donc franchement je pense ne rien faire d'extraordinaire.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 janvier 2023 à 22:15:59

                          profite que tu es sur un forum python pour mettre le code Python va ...

                          Le PHP je maîtrise pas, mais tu peux aller sur le forum adapté pour le présenter et vérifier que tout est ok.

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                            31 janvier 2023 à 22:22:06

                            Pas de soucis, mas déjà le code python fonctionne très bien donc je ne vois pas pourquoi le problème viendrait de lui mais pourquoi pas. Et de plus le code n'est pas très propre désolé.

                            import requests
                            import json
                            import mysql.connector
                            
                            # Définition des paramètres de la requête
                            params = {'realm': '/partenaire'}
                            
                            # Définition de l'entête de la requête
                            headers = {'Content-Type': 'application/x-www-form-urlencoded'}
                            
                            # Définition du corps de la requête
                            data = {"grant_type": "client_credentials",
                                    "client_id": "identifiant",
                                    "client_secret": "identifiant",
                                    "scope": "api_offresdemploiv2 o2dsoffre"}
                            
                            # Envoi de la requête POST
                            response = requests.post('https://entreprise.pole-emploi.fr/connexion/oauth2/access_token',
                                                      params=params,
                                                      headers=headers,
                                                      data=data)
                            
                            # Affichage de la réponse sous forme texte
                            print("Réponse format texte", response.text)
                            print()
                            
                            # Conversion de la réponse en objet JSON
                            dico = json.loads(response.text)
                            
                            # Récupération du jeton d'accès ainsi que sa durée de validité dans l'objet JSON
                            token = dico["access_token"]
                            expire = dico["expires_in"]
                            
                            print("le jeton d'accès est : ", token, " et il est valable pendant : ", expire/60, " minutes.")
                            print()
                            
                            
                            # Définition de l'entête de la requête
                            headers = {'Authorization': f'Bearer {str(token)}'}
                            
                            # Envoi de la requête GET avec l'entête d'autorisation
                            response = requests.get('https://api.pole-emploi.io/partenaire/offresdemploi/v2/offres/search?qualification=0&motsCles=informatique&commune=76322&origineOffre=2',
                                                     headers=headers)
                            
                            # Conversion de la réponse en objet JSON
                            liste_jobs = json.loads(response.text)
                            
                            # Connect to the database
                            cnx = mysql.connector.connect(user='root', password='rroot',
                                                          host='localhost', database='gabin.serrurot')
                            
                            # Create a cursor object
                            cursor = cnx.cursor()
                            
                            # Delete the database
                            query1 = "TRUNCATE `gabin.serrurot`.`api_poleemploi`"
                            cursor.execute(query1)
                            cnx.commit()
                            
                            # value sert à enregistrer les résultats de la recherche
                            value = []
                            try:
                                for job in liste_jobs['resultats']:
                                    """print("L'intitulé du job est :", job['intitule'])
                                    print()
                                    print("La commune d'exercice est :", job['lieuTravail']['commune'])
                                    print()
                                    print("La description du job est :", job['description'])
                                    print()
                            
                                    print("liste jobs :", liste_jobs['resultats'])"""
                            
                                    value.append((job['intitule'], job['lieuTravail']['commune'], job['description']))
                                    value.append(("test", 47, "test"))
                            except:
                                print("Il n'y a pas de résultats avec cette recherche.")
                            
                            # Execute a SQL query
                            query = "INSERT INTO api_poleemploi (intitule, commune, description) VALUES (%s, %s, %s)"
                            cursor.executemany(query, value)
                            cnx.commit()
                            
                            # Close the cursor and connection
                            cursor.close()
                            cnx.close()
                            

                            Mais encore une fois sachant que le code python fonctionne très bien seul ça me parait bizarre que le problème vienne de lui. La seule différence qu'il y a entre la situation avec deux fichiers et la situation avec un seul est la ligne avec le exec.

                            Je viens de me rendre compte de quelque chose. En continuant à chercher une solution, j'ai modifier mon code en remplaçant le exec par ceci :

                            $output=null;
                            $retval=null;
                            exec('combinaison.py', $output, $retval);
                            echo "Returned with status $retval and output:\n";
                            print_r($output);

                            que j'ai trouvé ailleurs. Il m'a affiché une erreur 127 ce qui signifie d'après mes recherches à un fichier inexistant si j'ai bien compris. J'imagine qu'on sort vachement du python donc je vais pas insister beaucoup ici mais si pour ma dernière chance ça peut t'aider à m'aider ?

                            -
                            Edité par GabinSerrurot1 31 janvier 2023 à 22:41:15

                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 janvier 2023 à 22:41:43

                              Dans ton code PHP, tu as essayé avec shell_exec au lieu de exec.

                              Effectivement si ta BDD est modifié avec ton code python seul, le problème ne vient pas du code Python.

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                31 janvier 2023 à 23:23:27

                                Alors j'avoue ne pas avoir pensé à cette fonction là. J'ai essayé avec system au cas où mais pas shell_exec. Ces deux commandes ont un fonctionnement vraiment différent ?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 février 2023 à 0:46:07

                                  Bonjour,

                                  Sans shebang (https://fr.wikipedia.org/wiki/Shebang), le script python donné ci-dessus ne peut pas être exécuté simplement en appelant le fichier. Les shebangs ne fonctionnent pas sur du Windows.

                                  Il faudrait plutôt utiliser l'interpréteur

                                  python script.py

                                  Si «python» correspond à l'interpréteur sur ton système (ça pourrait être «py» ou «python3» ou «py.exe» par exemple).

                                  Tu peux aussi passer le chemin du script en chemin absolu pour être sur que ce n'est pas un problème dû à l'environnement et au répertoire courant dans lequel ton script PHP s’exécute.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    1 février 2023 à 15:29:19

                                    euh dans le php je lis "database=root" alors que dans python, je lis database='gabin.serrurot' ; c'est peut-être ça le souci non ?
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 février 2023 à 19:31:31

                                      umfred a écrit:

                                      euh dans le php je lis "database=root" alors que dans python, je lis database='gabin.serrurot' ; c'est peut-être ça le souci non ?


                                      Nan le problème ne vient pas de là malheureusement, le problème que tu soulèves vient de moi qui pour présenter du code source sur le forum modifie mes identifiants mais ils sont bien cohérents dans mes fichiers.

                                      KoaTao a écrit:

                                      Bonjour,

                                      Sans shebang (https://fr.wikipedia.org/wiki/Shebang), le script python donné ci-dessus ne peut pas être exécuté simplement en appelant le fichier. Les shebangs ne fonctionnent pas sur du Windows.

                                      Il faudrait plutôt utiliser l'interpréteur

                                      python script.py

                                      Si «python» correspond à l'interpréteur sur ton système (ça pourrait être «py» ou «python3» ou «py.exe» par exemple).

                                      Tu peux aussi passer le chemin du script en chemin absolu pour être sur que ce n'est pas un problème dû à l'environnement et au répertoire courant dans lequel ton script PHP s’exécute.


                                      Le serveur de mon établissement est sensible avec le système d'exploitation de mon PC ? Parce que je viens d'essayer avec shell_exec comme le suggère fred1599, j'ai essayé avec les combinaisons que tu proposes mais rien n'y fait.

                                      Le gros problème juste que j'ai un code PHP qui fonctionne très bien, un code python qui fonctionne très bien mais je ne peux pas exécuter les deux codes en mêmes temps. 

                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Exécuter un script python en back-end

                                      × 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