Aller au contenu

Python 3 N'est Pas Interpr


ckl6767

Messages recommandés

Bonjour,

Pourriez-vous m'aider je débute en Python. :unsure:

J'ai installé Python3 sur le NAS à travers le Centre de paquet

Lorsque connecté en ssh sur mon serveur je lance un script Python, cela fonctionne bien.

A présent, je souhaiterais lancer un script à travers une requête html.

Dans mon index.html j'ai mis, entre autres...

<FORM ACTION="http://192.168.1.20/input_query.py" METHOD="post">
<INPUT TYPE="submit" NAME="send" VALUE="Exécuter le script">
</FORM>

Cela correspond à un bouton qui va lancer le script : "input_query.py"

Pour info, ce fichier est executable, et lorsque je le lance dans mon shell (connecté en ssh), j'obtiens le résultat escompté

Le fichier : input_query.py

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# Affichage d'un formulaire HTML simplifié :
print ("Content-Type: text/htmln")
print ("""
<H3><FONT COLOR="Royal blue">
Page web produite par un script Python
</FONT></H3>

<FORM ACTION="print_result.py" METHOD="post">
<P>Veuillez entrer votre nom dans le champ ci-dessous, s.v.p. :</P>
<P><INPUT NAME="visiteur" SIZE=20 MAXLENGTH=20 TYPE="text"></P>
<P>Veuillez egalement me fournir une phrase quelconque :</P>
<TEXTAREA NAME="phrase" ROWS=2 COLS=50>Mississippi</TEXTAREA>
<P>J'utiliserai cette phrase pour etablir un histogramme.</P>
<INPUT TYPE="submit" NAME="send" VALUE="Action">
</FORM>
""")

Finalement,

lorsque j'accède à ma page "index" à travers mon navigateur, et que j'appuie sur le bouton généré par "index.html" j'obtiens une nouvelle page qui affiche:

#!/usr/bin/python3
# -*- coding: UTF-8 -*-
# Affichage d'un formulaire HTML simplifié :
print ("Content-Type: text/htmln")
print ("""
<H3><FONT COLOR="Royal blue">
Page web produite par un script Python
</FONT></H3>

<FORM ACTION="print_result.py" METHOD="post">
<P>Veuillez entrer votre nom dans le champ ci-dessous, s.v.p. :</P>
<P><INPUT NAME="visiteur" SIZE=20 MAXLENGTH=20 TYPE="text"></P>
<P>Veuillez egalement me fournir une phrase quelconque :</P>
<TEXTAREA NAME="phrase" ROWS=2 COLS=50>Mississippi</TEXTAREA>
<P>J'utiliserai cette phrase pour etablir un histogramme.</P>
<INPUT TYPE="submit" NAME="send" VALUE="Action">
</FORM>
""")

C'est comme si le python n'a pas été exécuté :(

Avez-vous une explication ?

Merci

Christian

Modifié par ckl6767
Lien vers le commentaire
Partager sur d’autres sites

De base ta méthode est discutable .... Mais bon.

Pour faire marcher comme tu le propose il faut activer mod_python dans le serveur web mais je ne sais pas si syno le propose

Sinon il est préférable d'utiliser une des 2 méthodes ci dessous :

- travailler avec un script CGI

- générer un serveur web en phthon directement et au passage je te conseil d'utiliser un framework dédié genre django

Dernier point pourquoi du phyhon et pas du php ??

Lien vers le commentaire
Partager sur d’autres sites

Merci.

En fait j'ai déjà monté un serveur Web sur mon synology sur base de Joomla.

Ici, ce que je cherche de faire, est une simple page HTML, qui permettra d'interfacer mon aduino. (piloter des sorties/ lire les entrées analogiques)

D'où, l'idée du python.(langage que je découvre, on m'en a dit tellement du bien ^_^ )

L'exemple que je donnais n'a qu'un but de test, à savoir: lancer du code python à travers une requête HTML.

Pour mon application Arduino, (par exemple thermostat piloter par une page Web) je trouvais un framework comme django trop lourd.

Ton avis ?

Quel est la différence avec un script CGI ?

Je viens de faire un test, et déposé au niveau de ma racine web, le script hellohtml.cgi

#!/usr/bin/env python3

print("Content-Type: text/htmlnn")  # html markup follows

print("""
<html>
  <Title>Hello in HTML</Title>
<body>
  <p>Hello There!</p>
  <p><b>Hi There!</b></p>  
</body>
</html> """)
 

Lorsque j'accède à: http://192.168.1.20/hellohtml.cgi

Pas mieux :( "page introuvable"

Je regarde la possibilité d'activer le mod_python

Modifié par ckl6767
Lien vers le commentaire
Partager sur d’autres sites

Pour ce genre de chose j'utilise le module Python SimpleHTTPServer pour générer un serveur web en 3 ligne directement depuis Python et je m'en sert comme d'un web services en REST

Je fais l'interface directement dans Apache et j'appel en jquery le web service tu peux faire des interface super classe

Lien vers le commentaire
Partager sur d’autres sites

Les choses se compliques.. B)

* SimpleHTTPServer

* REST

Pour un débutant en Python ...

Disons que tous est parti du fait que je ne voulais pas faire tourner mon serveur Web uniquement sur Arduino, et profiter de l'environnement Synology/Apache/Python/.. pour monter mon serveur Web sur Synology (Celal laissant une plus grande ouverture .. ;) )

Et, ensuite de piloter mon Arduino à travers des messages UDP <<---->> Serveur Web Synology

Pour envoyer/recevoir ces messages UDP, je voulais utiliser la couche Python

Ne connaissant rien aux Webservices, j'ai peur de complexifier l'approche

Du coup la solution proposée par Mike913, et peu être plus adapté pour moi..

Un dernier avis ?

Lien vers le commentaire
Partager sur d’autres sites

Ne pas passer par un protocole haut niveau pour communiquer avec l'Arduino ? L'UDP ce n'est pas fiable, vaut mieux faire du TCP si tu veux rester sur de l'IP.

Perso je passe par des XBee avec protobuf pour la sérialisation des messages (librairie nanopb sur Arduino). Tu peux regarder le module Python que j'ai développé pour la communication avec un module XBee : http://hachi.readthedocs.org/en/latest/

Lien vers le commentaire
Partager sur d’autres sites

Les choses se compliques.. B)

* SimpleHTTPServer

* REST

Pour un débutant en Python ...

Disons que tous est parti du fait que je ne voulais pas faire tourner mon serveur Web uniquement sur Arduino, et profiter de l'environnement Synology/Apache/Python/.. pour monter mon serveur Web sur Synology (Celal laissant une plus grande ouverture .. ;) )

Et, ensuite de piloter mon Arduino à travers des messages UDP <<---->> Serveur Web Synology

Pour envoyer/recevoir ces messages UDP, je voulais utiliser la couche Python

Ne connaissant rien aux Webservices, j'ai peur de complexifier l'approche

Du coup la solution proposée par Mike913, et peu être plus adapté pour moi..

Un dernier avis ?

Alors REST ça veut dire que ça réagit à une requête GET ou POST comme une page web quoi ...

et simple http request c'est simple :

#!/usr/bin/env python2.7

import string,cgi,time
import urllib
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyHandler(BaseHTTPRequestHandler):

    def do_GET(self):
        try:
            print self.path
            if self.path == "/bonjour.html":
                self.send_response(200)
                self.send_header('Content-type',	'text/html')
                self.end_headers()
                self.wfile.write("bonjour");
                # la tu mets ton code que tu veux
                return
            if self.path == "/coucou.html":
                self.send_response(200)
                self.send_header('Content-type',	'text/html')
                self.end_headers()
                self.wfile.write("coucou");
                # la tu mets ton code que tu veux
                return
            return
                
        except IOError:
            self.send_error(404,'File Not Found: %s' % self.path)
def main():
    try:
        server = HTTPServer(('', 8888), MyHandler)
        print 'started httpserver...'
        server.serve_forever()
    except KeyboardInterrupt:
        print '^C received, shutting down server'
        server.socket.close()

if __name__ == '__main__':
    main()

Tu copies ça dans un fichier sur le nas tu le rends exécutable et tu l'exécute cela fait çà :

- crée un webservice sur le port 8888 qui réagit à des requêtes GET

- http://IPDUNAS:8888/bonjour.html -> affiche bonjour sur le shell et exécute ce que tu rajoutes à cet endroit dans le code

- http://IPDUNAS:8888/salut.html -> affiche salut sur le shell et exécute ce que tu rajoutes à cet endroit dans le code

on peux aller beaucoup plus loin et réagir aux requêtes POST on peux aussi servir des fichiers ou des répertoires entier avec qq ligne de plus

Lien vers le commentaire
Partager sur d’autres sites

Pas mal ... pas mal ;)

L'approche avec les webservices est super intéressante.

Je vais m'y intéressé, et peaufiner quelques exemples basiques

A première abord j'ai l'impression que ça répond à ma demande

En tous les cas, toutes les idées à travers ce Blog vont me permettre d'avancer dans la mise en place de ce petit projet.

  • "Module Client" Thermostat, pour prendre cet exemple avec : Arduino + Xbee :
  • "Module Centrale Principale" reliée au réseau Ethernet : Arduino + Xbee
  • "Serveur Web Synology": qui hébergera le serveur Web à travers des Web services python..

Merci ;)

Petite question subsidiaire, quel est environnement de développement que tu utilises pour développer en python ?

Modifié par ckl6767
Lien vers le commentaire
Partager sur d’autres sites

Je n'utilise pas d'IDE pour Python, je me contente d'un éditeur amélioré textwrangler ou notepad++ selon que je sois sous OS X/Linux ou Windows.

Si tu est intéressé par de la domotique du python et de la bidouille arduino jette un coup d'œil au protocole xpl c'est ce que j'utilise maintenant c'est franchement très puissant bien qu'un peu difficile d'accès mais tellement génial !!!

Lien vers le commentaire
Partager sur d’autres sites

Pour faire du CGI je te conseillerai Flask, ça évite de réinventer la roue. Tu fais ton application avec Flask puis tu fais un CGI à coté. Tu trouveras plein de documentation sur Flask + CGI sur Google et en plus tu peux tester en live avec le serveur intégré.

Coté protocole, il faut savoir que le XPL c'est très verbeux et tu vas te faire chier à sérialiser ton message si tu veux faire de l'XBee, c'est pour ça que je suis passé par protobuf perso, en plus ça fait du code clean. L'inconvénient c'est que nanopb, aussi petit soit-il, prend de la place sur l'Arduino donc je recommande 32kb minimum.

Lien vers le commentaire
Partager sur d’autres sites

Je vais t'indiquer la méthode la plus "propre" :

  1. Installer le paquet Python de SynoCommunity
  2. Se connecter en "root" en SSH
  3. > PATH=/usr/local/python/bin:$PATH # inclut les binaires python
  4. > cd /volume1/monappli/ # te déplace dans le répertoire de ton appli
  5. > virtualenv env # créé l'environnement virtuel
  6. > source env/bin/activate # active l'environnement virtuel
  7. > pip install Flask # installe flask dans cet environnement virtuel

Pour retourner dans ton appli par la suite :

  1. > cd /volume1/monappli/ && source env/bin/activate

Puis pour lancer ton appli "app.py" avec ton environnement virtuel :

  1. > python app.py

L'avantage de cette technique c'est que tu as un environnement séparé et que tu peux mettre à jour le paquet Python sans perdre aucune donnée. Par ailleurs si tu veux supprimer l'environnement virtuel tu n'as qu'a supprimé le répertoire "env" dans /volume1/monappli/

Lien vers le commentaire
Partager sur d’autres sites

La version de SynoCommunity fourni virtualenv sur Python 2.7 et Python3. Si tu veux utiliser venv à la place, effectivement il te faudra Python3.

Flask fonctionne en Python3 mais il se peut que certaines librairies tierces (extensions de Flask ou autres) ne soient pas encore portées. Le mieux c'est de commencer avec Python3 et si tu vois qu'un module dont tu as besoin n'est pas porté tu repasses sur Python 2.7. De toute façon 2.7 est très proche de 3.3+.

SynoCommunity fourni Python3 à la version 3.4.1 ainsi que certains modules préinstallés.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour

Je viens de développer mon application arduino avec Field Wifi qui communique en TCP avec un serveur web basé sur Flask et tournant sur Ubuntu.

J'ai procédé de la sorte pour faire mes premiers tests avant de tout pousser sur le NAS

Au passage: Flask est excellant, merci pour le conseil ;);)

Petite question que je n'arrive pas à résoudre sur synology

J'ai installé Python3 à partir du package de la SynoCommunity

Je voulais installer flask avec environnement virtuel comme suit

PATH=/usr/bin/python3:$PATH 

cd [myproject]
virtualenv venv -p /usr/bin/python3
. venv/bin/activate

#framework
pip install Flask

or virtualenv n'est pas reconnu, ni pip pour installer flask

Pourriez-vous me conseiller ?

Merci

Lien vers le commentaire
Partager sur d’autres sites

Sorry :(

Quand tu parlais de paquets de SynoCommunity, pour moi je pensais que tu voulais dire les paquets de synology ..

Je viens de faire l'installation

Après avoir du Mettre le niveau de confiance sur "N'importe quel éditeur", la paquet python3 c'est installé

Merci

Lien vers le commentaire
Partager sur d’autres sites

C'est toujours pas bon :(

DiskStation> pwd
/volume1/web/arduino/web_server
DiskStation> which virtualenv
/usr/local/python3/bin/virtualenv
DiskStation> virtuatlenv env
-ash: virtuatlenv: not found

Là je crois que c'est virtualenv qui ne s'est pas installé correctement :angry:


DiskStation> ll /usr/local/python3/bin/virtualenv
-rwxr-xr-x 1 root root 333 Sep 16 08:10 /usr/local/python3/bin/virtualenv
DiskStation>

Auriez-vous une idée ??

Modifié par ckl6767
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.