Python:gaeproject:aulnayperfss

De Les Tutoriaux du WebMestre
Aller à : navigation, rechercher

Mise en place sous Eclipse

Récupération des sources

  • les sources sont présentes sur GitHub
    • pour les récupérer, faire un git clone ce qui donne dans mon cas:
jpmena@jpmena-P34:~/RSM$ git clone git@github.com:javaskater/appenginegps.git
Cloning into 'appenginegps'...
remote: Counting objects: 182, done.
remote: Total 182 (delta 0), reused 0 (delta 0), pack-reused 182
Receiving objects: 100% (182/182), 1.14 MiB | 550.00 KiB/s, done.
Resolving deltas: 100% (71/71), done.
Checking connectivity... done.
jpmena@jpmena-P34:~/RSM$ ll appenginegps/
total 80
drwxrwxr-x 11 jpmena jpmena  4096 janv.  8 19:56 ./
drwxr-xr-x 12 jpmena jpmena  4096 janv.  8 19:56 ../
-rw-rw-r--  1 jpmena jpmena   570 janv.  8 19:56 app.yaml
drwxrwxr-x  5 jpmena jpmena  4096 janv.  8 19:56 bootstrap-3.3.4-dist/
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 css/
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 fitparse/
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 fitutils/
drwxrwxr-x  8 jpmena jpmena  4096 janv.  8 19:56 .git/
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 gpxparse/
-rw-rw-r--  1 jpmena jpmena   438 janv.  8 19:56 helloworld.py
-rw-rw-r--  1 jpmena jpmena 12147 janv.  8 19:56 home.html
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 images/
drwxrwxr-x  3 jpmena jpmena  4096 janv.  8 19:56 js/
-rw-rw-r--  1 jpmena jpmena    15 janv.  8 19:56 README.md
-rw-rw-r--  1 jpmena jpmena   221 janv.  8 19:56 requirements.cfg.txt
drwxrwxr-x  2 jpmena jpmena  4096 janv.  8 19:56 scripts/
-rwxrwxr-x  1 jpmena jpmena  4574 janv.  8 19:56 tracesgps.py

Création d'un environnement virtuel Python basé sur Python 2.7

jpmena@jpmena-P34:~$ mkvirtualenv -p python2.7 aulnayperfs_gae_env
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in aulnayperfs_gae_env/bin/python2.7
Also creating executable in aulnayperfs_gae_env/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/predeactivate
virtualenvwrapper.user_scripts creating /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/postdeactivate
virtualenvwrapper.user_scripts creating /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/preactivate
virtualenvwrapper.user_scripts creating /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/postactivate
virtualenvwrapper.user_scripts creating /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/get_env_details
(aulnayperfs_gae_env)jpmena@jpmena-P34:~$ #on voit que je suis driectement placé dans l'envvironnement créé

Création d'un projet Python 2.7 sous Eclipse

Ajouter dans les runtimes PyDev l'environnement virtuel précédemment créé

  • Sous Eclipse, aller sous Windows -> Preferences -> PyDev -> Interpreters -> Python Interpreter
    • A droite et en haut, cliquer sur New
      • Pour le Interpreter Name, mettre par exemple Python 2.7 Aulnay
      • Pour le Interpreter Executable, sélectionnez via le bouton Browse, l'interpréteur Python 2.7 de l'environnement virtuel aulnayperfs_gae_env juste créé, ce qui donne comme chemin: $HOME/Python/.virtualenvs/aulnayperfs_gae_env/bin/python2.7'
    • Cliquez sur OK (3 fois au total); l'interpréteur Python 2.7 Aulnay et son PYTHONPATH sont désormais connnus de Eclipse/Pydev

Créer le projet

  • Rappel: les sources ont été clonées depuis GitHub sous ~/RSM
  • Démarrer Eclipse en choisissant ~/RSM comme Workspace
  • Sous Eclipse passer en perspective PyDev
  • Menu File->New->Project...
  • dans la petite fenêtre ouverte, descendre pour déplier Pydev puis sélectionner Pydev Google Appengine Project, cliquez sur Next
  • Sur le fenêtre qui s'est ouverte:
    • mettre appenginegps comme Project Name (les source clonées sont en effet sous ~/RSM/appenginegps mais comme on n'a pas sauvegardé sur GitHub la configuration Eclipse/Pydev, donc il ne s'agit pas d'un pprojet existant à importer tel quel)
    • Sélectionner Python 2.7 Aulnay comme interpréteur Python (il s'agit de l'interpréteur Python associé à l'environnement virtuel créé pour le projet, interpréteur que l'on a configuré juste au dessus pour Eclipse/PyDev)
    • laisser 2.7 comme Grammar Version
    • cliquer sur Next
    • sur la nouvelle fenêtre atteindre /home/jpmena/Ateliers/google-cloud-sdk/platform/google_appengine via le Bouton Browse (c'est là que se trouve le appcfg.py du SDK!)
      • Eclipse propose toute une sélection de librairies, laisser sélectionné !!!
      • cliquer sur OK
    • retour par Eclipse sur fenêtre parente, cliquer sur Next
    • What the Application ID ... j'entre l'identifiant de mon projet en l’occurrence alnayperfs
    • je laisse Empty Project pour le champs au dessous (en effet les sources existent déjà)
    • Je clique enfin sur Finish

Ajout des librairies demandées

  • La création du projet Eclipse via le template PyDev Google App Engine a ramené les bonnes dépendances
  • L'installation ci dessous des dépendances (installation hors Eclipse) nous permet de démarrer le serveur local Python en mode debug depuis la ligne de commande ...

Ajout en ligne de commande

Explications/Prérequis
  • L'ajout se fait via un fichier requirements.cfg.txt (fichier destiné à pip comme expliqué guide utilisateur de pip), c'est un fichier que l'on construit à partir de la section libraries du fichier central d'aune application GAE sous Python à savoir app.yml (également à la racine du projet); dans notre cas ces lignes sont:
jpmena@jpmena-P34:~/RSM/appenginegps$ tail -7 app.yaml 
libraries:
- name: webapp2
  version: 2.5.2
- name: jinja2
  version: 2.6
- name: lxml
  version: latest
jpmena@jpmena-P34:~/RSM/appenginegps$ cat requirements.cfg.txt 
lxml==2.3.5
webapp2==2.5.2
jinja2==2.6
l'installation elle même:
  • On passe les commandes suivantes:
#on se déplace dans l'environnement virtuel pour notre projet GAE
jpmena@jpmena-P34:~/RSM/appenginegps$ workon aulnayperfs_gae_env
#on regarde l'option de pip qui permet d'installer à partir d'un fichier de requirements, ill s'agit de -r
(aulnayperfs_gae_env)jpmena@jpmena-P34:~/RSM/appenginegps$ man pip
#on applique la commande qui va bien et on logue le résultat
(aulnayperfs_gae_env)jpmena@jpmena-P34:~/RSM/appenginegps$ pip install -r requirements.cfg.txt
Collecting lxml (from -r requirements.cfg.txt (line 1))
  Downloading lxml-3.5.0.tar.gz (3.8MB)
Collecting webapp2==2.5.2 (from -r requirements.cfg.txt (line 2))
  Downloading webapp2-2.5.2.tar.gz (191kB)
Collecting jinja2==2.6 (from -r requirements.cfg.txt (line 3))
  Downloading Jinja2-2.6.tar.gz (389kB)
Building wheels for collected packages: lxml, webapp2, jinja2
  Running setup.py bdist_wheel for lxml
  Complete output from command /home/jpmena/Python/.virtualenvs/aulnayperfs_gae_env/bin/python2.7 -c "import setuptools;__file__='/tmp/pip-build-L1b6aZ/lxml/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" bdist_wheel -d /tmp/tmpiM1AhTpip-wheel-:
  Building lxml version 3.5.0.
  Building without Cython.
  Using build configuration of libxslt 1.1.28
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-2.7
  creating build/lib.linux-x86_64-2.7/lxml
.................................................
  libxml2 -Isrc/lxml/includes -I/usr/include/python2.7 -c src/lxml/lxml.etree.c -o build/temp.linux-x86_64-2.7/src/lxml/lxml.etree.o -w
    src/lxml/lxml.etree.c:85:20: fatal error: Python.h: No such file or directory
    compilation terminated.
    Compile failed: command 'x86_64-linux-gnu-gcc' failed with exit status 1
    cc -I/usr/include/libxml2 -I/usr/include/libxml2 -c /tmp/xmlXPathInitfFCdE6.c -o tmp/xmlXPathInitfFCdE6.o
    /tmp/xmlXPathInitfFCdE6.c:2:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
     main (int argc, char **argv) {
     ^
    error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
  • on a bien le problème attendu pour lxml (librairie avec extension C car soumise à performance) qui est propre à ce projet qui traite des fichiers de trace GPS au format XML via la librairie Python lxml
  • comme précédemment indiqué blog précité indique:
    • Les bibliothèques avec des extensions en C sont très courantes dans les domaines qui ont besoin de performances: drivers de base de données (mysql-python), calculs scientifiques (numpy), parsing (lxml), cryptographie (pycrypto), etc.
  • la librairie libxml2-dev et libxslt1 sont déjà installés sous Ubuntu, c'est python-dev qui manque (pour compiler les bibliothèque avec C-extension pour Python 2.7):
jpmena@jpmena-P34:~/RSM/appenginegps$ sudo apt-get install python-dev
Lecture des listes de paquets... Fait
Construction de l arbre des dépendances       
Lecture des informations d état... Fait
Les paquets suivants ont été installés automatiquement et ne sont plus nécessaires :
  linux-headers-4.2.0-19 linux-headers-4.2.0-19-generic linux-image-4.2.0-19-generic linux-image-extra-4.2.0-19-generic
Veuillez utiliser « apt-get autoremove » pour les supprimer.
Les paquets supplémentaires suivants seront installés : 
  libpython-dev libpython2.7-dev python2.7-dev
Les NOUVEAUX paquets suivants seront installés :
  libpython-dev libpython2.7-dev python-dev python2.7-dev
0 mis à jour, 4 nouvellement installés, 0 à enlever et 22 non mis à jour.
Il est nécessaire de prendre 28,0 Mo dans les archives.
Après cette opération, 41,2 Mo d espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] #je répond O
...................................
  • je rejoue alors le fichier de requirements:
(aulnayperfs_gae_env)jpmena@jpmena-P34:~/RSM/appenginegps$ pip install -r requirements.cfg.txt | tee install.log
Collecting lxml==2.3.5 (from -r requirements.cfg.txt (line 1))
  Using cached lxml-2.3.5.tar.gz
Collecting webapp2==2.5.2 (from -r requirements.cfg.txt (line 2))
Collecting jinja2==2.6 (from -r requirements.cfg.txt (line 3))
Building wheels for collected packages: lxml
  Running setup.py bdist_wheel for lxml
  Stored in directory: /home/jpmena/.cache/pip/wheels/7f/3a/10/dd0274b151c533c40f5f7fd810e86a268f952b37921ebf12c9
Successfully built lxml
Installing collected packages: lxml, webapp2, jinja2
Successfully installed jinja2-2.6 lxml-2.3.5 webapp2-2.5.2
  • il nous indique bien qu'il a Successfully installed jinja2-2.6 lxml-2.3.5 webapp2-2.5.2

Démarrer l'application et écouter en Debug

  • Sous Eclipse: Debug -> Debug configurations dans la fenêtre qui s'ouvre:
    • A gauche, on sélectionne Python run (je n'arrive pas à faire fonctionner PyDev Google App Run)
    • En haut et à gauche, on clique sur le bouton New Launch Configuration et on complète la nouvelle configuration comme suit:
      • Name: je remplace le nom par défaut par un nom parlant, dans mon cas aulnayperfs (l'identifiant de mon appli GAE)
      • Project: je sélectionne via le bouton Browse appenginegps
      • Main Module: j'entre directement à la main: ${GOOGLE_APP_ENGINE}/dev_appserver.py
      • Je passe à l'onglet Arguments
      • Sous Program arguments j'entre à la main: ${project_loc:appenginegps}
      • cliquer sur Apply puis sur Debug