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.
#!/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
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 !
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
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]
"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 !!!!!!! 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 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
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
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.
Ok merci pour tout les amis !!! 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
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.
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.
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
Je déterre ce très vieux sujet car je souhaite refaire ce projet par nostalgie
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]
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())
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 ?
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.
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.
Blond, bouclé, toujours le sourire aux lèvres...