Partage
  • Partager sur Facebook
  • Partager sur Twitter

Python sur page web en php

    23 avril 2014 à 11:12:49

    Bonjour à tous,

    Je suis novice en Python et j'aimerais exécuter un script Python sur une page web en PHP. Ce script me permet de lire les données envoyées par ma Arduino Uno sur le port USB de mon PC. Lorsque je l'exécuter sur le terminal Ubuntu ça fonctionne parfaitement. 

    J'ai crée un répertoire dans var/www en localhost pour tester le script python sur une interface web. J'ai mis à l'intérieur le script PHP + Python. Je leur est donné les droits chmod 777. 

    Script PHP :

    <body> 
     
    <?php
    $output = shell_exec('python humidite.py');
    echo "<pre>$output</pre>";
    ?>
     
    </body> 
    </html>

    Script Pyhton :

    #!/usr/bin/python
     
    import serial
    import time
     
    locations=['/dev/ttyACM0']
     
    for device in locations:
        try:
            ser = serial.Serial(device, baudrate=9600, timeout=1, writeTimeout=1)
            while True:
                ligne = ser.readline()
                print ligne
     
        except:
            print "Echec de connexion sur", device

    Mais ça m'affiche sur ma page web : Echec de connexion sur /dev/ttyACM0

    D'où vient le problème svp ? :D

    -
    Edité par Prav26 23 avril 2014 à 11:13:31

    • Partager sur Facebook
    • Partager sur Twitter
      23 avril 2014 à 13:32:47

      Ça peut être un problème de droits (pas de chmod du script, mais de droit d'utilisation des ports série, par exemple).

      Avec quel utilisateur ton script est-il lancé ?

      Remplace ton code php par ceci pour le déterminer :

      <?php
      $output = shell_exec('whoami');
      echo "$output";
      ?>
      

      -
      Edité par nohar 23 avril 2014 à 16:22:47

      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        23 avril 2014 à 16:25:18

        Essaye ceci dans une console :

        sudo -u www-data python humidite.py
        

        Ou bien si tu es connecté en root :

        su - www-data
        python humidite.py
        

        -
        Edité par nohar 23 avril 2014 à 16:26:14

        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          23 avril 2014 à 17:27:15

          nohar a écrit:

          Essaye ceci dans une console :

          sudo -u www-data python humidite.py 

          Edité par nohar il y a environ 1 heure

          Quand je tape la commande ça me met : Echec de connexion sur /dev/ttyACM0

          -
          Edité par Prav26 23 avril 2014 à 17:27:35

          • Partager sur Facebook
          • Partager sur Twitter
            23 avril 2014 à 17:51:42

            OK, donc c'est très certainement ça : une question de droit d'accès de l'utilisateur www-data au port série de ton Arduino.

            Essaye ceci :

            sudo usermod -a -G dialout www-data
            sudo -u www-data python humidite.py
            

            Si ça marche, alors ton problème est définitivement résolu.

            Sinon, remplace ton except par except Exception as e: print e pour avoir l'exception détaillée.

            -
            Edité par nohar 23 avril 2014 à 18:22:07

            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              23 avril 2014 à 18:36:22

              Ça fonctionne maintenant parfaitement dans le terminal Ubuntu en tapant dedans :

              sudo usermod -a -G dialout www-data
              sudo -u www-data python humidite.py

              Mes mesures défilent dans le terminal. Mais ça ne fonctionne toujours pas dans ma page PHP.

              J'ai rajouté dans mon script Python :

              except Exception as why:
                      print "Echec de connexion : %s" % why


              Quand je lance ma page PHP c'est écrit : Echec de connexion : could not open port /dev/ttyACM0: [Errno 13] Permission denied: '/dev/ttyACM0'

              -
              Edité par Prav26 23 avril 2014 à 18:41:30

              • Partager sur Facebook
              • Partager sur Twitter
                23 avril 2014 à 18:56:15

                Wow, alors ça c'est bizarre.

                Rajoute un appel à os.getusername() dans le message de l'exception pour être sûr que c'est bien exécuté en tant quewww-data.

                Que retourne ls -l /dev/ttyACM0 ?

                Sinon sudo chmod 666 /dev/ttyACM0 devrait résoudre le problème, mais de façon temporaire.

                -
                Edité par nohar 23 avril 2014 à 18:59:22

                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  23 avril 2014 à 19:18:17

                  J'ai tapé sudo chmod 666 /dev/ttyACM0 dans le terminal Ubuntu mais maintenant ma page PHP ne se lance plus. Elle charge en continu et n'affiche donc plus rien dessus. Mais quand je tape sudo -u www-data python humidite.py dans le terminal Ubuntu les mesures s'affichent bien sur le terminal.

                  Quand je tape sudo -u www-data python humidite.py dans le terminal Ubuntu, les leds normalement fixes de l'Arduino se mettent à clignoter tant que je n'ai pas arrêté le programme.

                  Quand je lance ma page en PHP, les leds normalement fixes de l'Arduino se mettent à clignoter. Mais même quand je ferme la page en PHP ça continu à clignoter. Pour arrêter le clignotement je dois débrancher l'Arduino puis la rebrancher.

                  Je suppose que la page en PHP est maintenant en train de lire les mesures mais qu'elle n'arrive pas à les afficher sur la page web. Il faut peut-être mettre une commande dans le script en PHP ou Python pour afficher ces mesures sur la page web et arrêter le script quand je ferme la page ?

                  Je suis sûr qu'on réussira bientôt, on y est presque ! :D

                  Pourrais-tu stp m'indiquer précisément où mettre os.getusername() dans le message de l'exception dans le script Python ? Je viens tout juste de me mettre au Python ce midi donc j'ai du mal à comprendre pour l'instant les commandes :)

                  -
                  Edité par Prav26 23 avril 2014 à 20:26:48

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 avril 2014 à 20:56:38

                    J'ai tapé sudo chmod 666 /dev/ttyACM0 dans le terminal Ubuntu mais maintenant ma page PHP ne se lance plus. Elle charge en continu et n'affiche donc plus rien dessus. Mais quand je tape sudo -u www-data python humidite.py dans le terminal Ubuntu les mesures s'affichent bien sur le terminal.

                    C'est normal : le script python ne s'arrête jamais à cause du while True. Remplace-le par un for _ in range(15) pour t'arrêter après les 15 premières lignes.

                    Pourrais-tu stp m'indiquer précisément où mettre os.getusername() dans le message de l'exception dans le script Python ? Je viens tout juste de me mettre au Python ce midi donc j'ai du mal à comprendre pour l'instant les commandes

                    except Exception as why: 
                        import pwd, os
                        print "Echec de connexion : %s" % why
                        print "whoami:", pwd.getpwuid(os.getuid())[0] 
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      23 avril 2014 à 22:18:43

                      "C'est normal : le script python ne s'arrête jamais à cause du while True. Remplace-le par un for _ in range(15) pour t'arrêter après les 15 premières lignes."

                      Ça fonctionne !!!!!!! :D Merci infiniment nohar pour ton aide. Ça fait plus d'un mois que je recherche une solution à ce problème !

                      Mais j'aimerais que ça m'affiche que sur une seule ligne les mesures et que ça défile continuellement. Par exemple je ferais un script PHP où il y aura écris Humidité=....... et sur ces pointillés les mesures changeront. J'espère que je me suis fait comprendre :p A ton avis c'est faisable en modifiant le script Python ou PHP ?  

                      Lorsque je rentre ce code :

                      except Exception as why:
                          import pwd, os
                          print "Echec de connexion : %s" % why
                          print "whoami:", pwd.getpwuid(os.getuid())[0]

                      ma page PHP ne fonctionne plus. Sur le terminal Ubuntu c'est écrit :

                      File "humidite.py", line 16
                          import pwd, os
                               ^
                      IndentationError: expected an indented block




                      -
                      Edité par Prav26 23 avril 2014 à 22:22:41

                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 avril 2014 à 22:46:35

                        Faisable oui, il faut utiliser du javascript sur ta page, établir une connexion persistante entre le serveur et la page web. Tu peux te servir de bibliothèques javascript comme socket.io par exemple.

                        EDIT : Pour ton bug, c'est un problème d'indentation (c'est marqué). C'est facile à régler normalement, même pour un débutant. Indice quand même, si tu as copié-collé le bout de code, recopie le à la main, parfois l'indentation a l'air correcte mais elle ne l'est pas.

                        -
                        Edité par LoupSolitaire 23 avril 2014 à 22:50:33

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Blond, bouclé, toujours le sourire aux lèvres...

                          24 avril 2014 à 0:31:55

                          Il faut bien comprendre le workflow que tu as mis en place :

                          • Ton navigateur appelle ton serveur http via une URL
                          • Ton serveur interprète la requête http et exécute le script php correspondant
                          • Le script php lance le script python
                          • Le script python lit les mesures sur le port série et les envoie sur sa sortie standard, puis il s' arrête et rend la main au script php
                          • Le script php récupère la sortie standard du script python et génère la page html qu'il renvoie au serveur http.
                          • Le serveur récupère la sortie html et crée une réponse http qu'il envoie sur sa connexion avec ton navigateur
                          • Ton navigateur désencapsule la réponse http et génère l'affichage correspondant au html qu'elle contient.

                          Tu vois bien que c'est un cycle en V. Du coup tu ne peux pas faire comme ça si tu veux que l'affichage se mette à jour régulièrement. Il te manque quelquechose pour mettre à jour seulement une partie du html dans le navigateur.

                          Ce genre de truc se fait en javascript. L'idée c'est de rajouter un bout de javascript sur ta page qui va se charger d'appeler régulièrement un script php sur ton serveur (qui va lui-même appeler du python) pour récupérer une ligne de données avec laquelle tu peux mettre à jour ta page dynamiquement. LoupSolitaire t'a donné une piste pour ça.

                          Dans les faits, tu irais aussi sûrement plus vite en supprimant l'étape PHP, et en faisant en sorte que ton serveur http exécute directement du python. Ça peut se faire avec la bibliothèque CGI (standard) de python, ou encore avec un framework comme cherrypy si tu veux le faire de façon un peu plus feng-shui et compatible avec une grosse application.

                          -
                          Edité par nohar 24 avril 2014 à 0:34:59

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            24 avril 2014 à 7:51:06

                            Ok merci pour tout les amis !!!  :D Je vais étudier dès aujourd'hui les solutions en javascript !

                            J'ai une dernière question. Pour l'instant je ne vais afficher qu'une seule ligne que j'actualiserai à chaque fois. Dans mon script en Python je charge 4 lignes donc 4 mesures. Mais je ne veux afficher que la 4ème ligne sur la page en PHP car la 1ère mesure est souvent erronée. 

                            Comment faire svp ?

                            Voici mes commandes :

                            for device in locations:
                                try:
                                    ser = serial.Serial(device, baudrate=9600, timeout=1, writeTimeout=1)
                                    for _ in range(4):
                                        ligne = ser.readline()
                                        print ligne



                            -
                            Edité par Prav26 24 avril 2014 à 8:44:48

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              24 avril 2014 à 9:09:13

                              PySerial utilise aussi la méthode readlines(), dans ton cas le plus simple serait (pas testé)

                              try:
                                  ser = ...
                                  line = ser.readlines()[3].strip('\n')
                              ...



                              -
                              Edité par Anonyme 24 avril 2014 à 9:10:33

                              • Partager sur Facebook
                              • Partager sur Twitter
                                24 avril 2014 à 9:26:40

                                Super fred1599 ! Çà fonctionne parfaitement :lol:

                                Connais-tu par hasard la commande en php pour arrêter un script python ? Par exemple, je viens de créer un petit programme. Quand je clique sur ON ça exécute le script Python et quand je clique sur OFF ça arrête le script Python. J'ai un autre problème, quand je lance cette page en PHP ma valeur est déjà inscrite sur ma page sans avoir cliqué sur ON.

                                <!DOCTYPE html>
                                <html>
                                 
                                    <body>
                                         
                                            <form action="valeur.php" method="get">
                                            <input type="submit" value="ON" name="bouton1">
                                            <input type="submit" value="OFF" name="bouton1">
                                            </form>
                                 
                                            <?php
                                 
                                            if ($_GET["bouton1"]=="ON")
                                                {
                                                $output = shell_exec('python affichage.py');
                                				echo "<pre>$output</pre>";  
                                                }
                                            else
                                                {
                                                $output = shell_exec('python affichage.py');
                                				echo "<pre>$output</pre>";         
                                                }  
                                            ?>                    
                                     
                                    </body>
                                </html>



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  24 avril 2014 à 9:35:13

                                  Je pense que tu n'as pas bien compris mon dernier post ni le code que tu viens de faire en php.

                                  Si l'utilisateur a cliqué sur ON ça rentre dans le if, sinon, qu'il ait cliqué ou non sur OFF, ça rentre dans le else. Quoi qu'il en soit tu ne peux pas, en php, lancer un programme et retourner un résultat avant que celui-ci ne se soit arrêté. Il te faut donc rajouter une couche de complexité : si tu veux mettre à jour régulièrement ton résultat tu dois le faire en javascript. Si tu veux que ton soft tourne en tâche de fond et retourne une ligne chaque fois que le serveur l'interroge, alors il faut que tu le transforme en daemon et que tu crées encore un autre script qui va l'interroger via une socket Unix (ce qui n'est probablement pas à ta portée si tu débutes en Python).

                                  À mon avis tu aurais plus vite fait de commencer par te débarasser de la couche php en apprenant à la remplacer par du Python.

                                  -
                                  Edité par nohar 24 avril 2014 à 9:43:36

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    24 avril 2014 à 9:40:33

                                    Mince tu as raison j'ai fais une erreur stupide ! C'est la fatigue :euh:

                                    <!DOCTYPE html>
                                    <html>
                                     
                                        <body>
                                             
                                                <form action="valeur.php" method="get">
                                                <input type="submit" value="ON" name="bouton1">
                                                <input type="submit" value="OFF" name="bouton1">
                                                </form>
                                     
                                                <?php
                                     
                                                if ($_GET["bouton1"]=="ON")
                                                    {
                                                    $output = shell_exec('python affichage.py');
                                    				echo "<pre>$output</pre>";  
                                                    }
                                    
                                                else if ($_GET["bouton1"]=="OFF")
                                      
                                                ?>                    
                                         
                                        </body>
                                    </html>



                                    -
                                    Edité par Prav26 24 avril 2014 à 10:02:19

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      24 avril 2014 à 9:50:00

                                      Le problème énoncé dans ce sujet est un bout de mon code de mon projet BAC. 

                                      J'utilise le PHP afin de créer un tableau me permettant d'allumer ou d'éteindre des appareils électrique à distance. Dans ce tableau je mettrai la mesure de l'hygrométrie d'une pièce de l'habitat. Si je trouve que l'hygrométrie est basse alors j'activerai mon humidificateur par mon interface web.

                                      Mon tableau est terminé et j'arrive à activer ou désactiver les prises électriques à distance. Ma page web est mise dans ma Raspberry Pi.

                                      J'utilise le PHP car c'est le code que l'on utilise en cours. Le Python je ne le connais que depuis hier :p 

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        25 mars 2019 à 15:48:42

                                        Bonjour à tous,

                                        Je déterre ce très vieux sujet car je souhaite refaire ce projet par nostalgie :D

                                        Lorsque j’exécute le script ci-dessous, rien n'est affiché sur ma page php alors que cela fonctionnait parfaitement "à l'époque". Pour tester ce script python, je l'ai directement exécuté sur la console de ma Raspberry et il y a des messages d'erreur. Je ne comprends pas.

                                        #!/usr/bin/python
                                        
                                        import serial #Import du module "serial"
                                        import time #Import du module "time"
                                        
                                        locations=['/dev/ttyACM0'] #Chemin où récupérer les informations
                                        
                                        for device in locations: #Pour l'appareil situé dans le chemin '/dev/ttyACM0'
                                            try: #essayer le code suivant
                                                ser = serial.Serial(device, baudrate=9600, timeout=1, writeTimeout=1) #configuration du port série pour récupérer ses informations
                                                line = ser.readlines()[3].strip('\n') #lecture de la 3ème ligne
                                                print line #affichage de la ligne
                                        
                                            except Exception as why: 
                                                    import pwd, os
                                                    print "Echec de connexion : %s" % why
                                                    print "whoami:", pwd.getpwuid(os.getuid())[0]

                                        Console Rapsberry :

                                        Auriez-vous svp une solution à m'apporter ?

                                        En vous remerciant par avance.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          25 mars 2019 à 15:51:55

                                          C'est du python2 ? Essaye d'ajouter cette ligne en deuxième ligne de ton fichier :

                                          # coding: utf-8



                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            29 mars 2019 à 14:26:28

                                            Merci thelinekioubeur pour ta réponse. Effectivement il s'agit de Python2 et plus précisément Python 2.7.13

                                            J'ai bien rajouté # coding: utf-8 à la 2ème ligne de mon fichier.

                                            Mais cela ne fonctionne toujours pas. J'ai ce message quand je lance mon script sur la console de la Raspberry et sur ma page php : 

                                            Echec de connexion : list index out of range
                                            whoami: www-data

                                            Ma arduino fonctionne bien avec la Raspberry, car lorsque j'exécute le script python ci-dessous sur la console de ma Raspberry pour tester, je lis bien les bonnes informations :

                                            # Import de la librairie serial
                                            import serial
                                            
                                            # Ouverture du port serie avec :
                                            # '/dev/ttyACM0' : definition du port d ecoute (remplacer 'X' par le bon nom)
                                            # 9600 : vitesse de communication
                                            serialArduino = serial.Serial('/dev/ttyACM0', 9600)
                                            
                                            
                                            # Ecriture de chaque message recu
                                            while True :
                                              	print(serialArduino.readline())


                                            Auriez-vous svp d'autres solutions à m'apporter ? :D

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              1 avril 2019 à 14:38:31

                                              Excusez-moi est-ce qu'une personne aurait svp une réponse à m'apporter à mon précédent message ?

                                              -
                                              Edité par Prav26 4 avril 2019 à 9:01:57

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                4 avril 2019 à 9:03:55

                                                Svp ? Excusez-moi d'être aussi insistant mais ce problème me prend la tête alors que ça fonctionnait parfaitement avant :(
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  4 avril 2019 à 9:26:08

                                                  Tu n'as pas une stacktrace ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    4 avril 2019 à 11:39:10

                                                    Oula excuse-moi je suis vraiment un novice. Je ne comprend pas ce qu'est un stacktrace .
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      4 avril 2019 à 11:47:33

                                                      Un retour d'erreur plus complet que ce que tu as donné.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        4 avril 2019 à 14:14:27

                                                        C'est noté merci bien  C'est comme un compilateur du coup. Je vais me renseigner sur internet comment faire sur du code Python. À moins que vous ayez une méthode simple et rapide ? :)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          4 avril 2019 à 14:51:52

                                                          La stacktrace, c'est le traceback en Python. C'est le message d'erreur complet, avec tout le suivi de l'erreur, notamment la ligne où elle se déclenche.

                                                          Dans ton cas c'est assez simple à deviner. Tu as une IndexError (out of range) dans ton code, elle se situe au seul endroit ou tu utilises un index, ligne 10.

                                                          Tu essaye d'accéder à l'index 3 d'une liste, donc au quatrième élément de la liste, alors que la liste ne compte que 3 élément. Tu as oublié que les index commence toujours à 0.

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Python sur page web en 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