Script Python

Un article de WikiSigPlus.

Jump to: navigation, search

voir Ironpython application, C#application

manifold supporte grace à win32all ou ironpython l'environnement python (os python et modules).Le passage d'un script python lancer depuis le file system de l'os a un script lancer depuis la fenêtre projet de manifold nécessite de mettre dans le fichiers script de manifold les imports au début, puis les def puis enfin notre programme dans def Main(): sans oublier d'indenter le texte avec que des tab ou des espaces .

Sommaire

shell python

  • Ce chapitre va passer en revue les modules python interessant a installer en cartographie.LE premier chapitre resumes les mdules , les suivant montrent comment installer ses modules

modules python

  • Les modules utilisables sont repétoriés ci dessous mais ilexiste un hack a ne pas utiliser ne production regroupant gdal ogr mapscript ...(web)
  • python évolue mais pas les modules s'endoute faut il avoir plusieurs v ersions et modules python installé en même temps et changer les variables d'environnement pour prendre en compte la version a utiliser .
C:\python24
C:\python25  voir ce lien pour connaitre version compatible python + module scientifique 
C:\python27
modules python (alphabétique) ( voir aussi postgis
modules python 2.3python 2.4 python 2.5 [1] python 2.6 [2] commentaires
ctype 1.0.2 include
Django (web) 1.0 tar
GeoDjango 1.0doc (web) minimun need ctype lib recommanded
elementtree (web) 1.2.6 1.2.7exe-zip
lxml (web) 2.1.2 tgz
maplotlib (web) 0.98.3 egg], exe
mxdateTime(web) 3.1.1 (exe) 2.0 tar
Numeric/numpy(web) 24.2 24.2->1.2.0
PIL(web) 1.1.6 1.1.6
Postgres PyGreSQL(web) 3.8.1 python 2.4.3 postgresql 8.1.4
Postgres Psycopg [web] import psycopg ou psycopg2
pywin32(web) 212 212 212 212
septutools 0.6c1 zip
simplejson (web) tar 1.4]
geopy(web) 0.93 egg 0.93egg 0.93egg non rien
zope (web)(2.8.8) 2.11.1 exe
PCL (web) 0.10.0 zip Python cartographic Library
MySQL-python (1.2.2 1.2.2) non rien !(utiliser win32) import MySQLdb
Scipy (web) 0.6.00.6.0 0.6.0 non rien
netbeans (web) ok
QT ([ web]) rien Eric3snapshot2005-04-10 PyQtGPL10.exe rien lire QT

connaitre les versions

il existe un script qui permet de voir ce qui est installer [3] voir test_version ici un exemple

environnement python

Il faut installer l'environnement python pour utiliser le compilateur et la machine python . Après téléchargement sur le site (web du logiciel dans sa version 2.4.4; on le lance en allant dans Démarrer|Executer|python


Le téléchargement et l'installation doit prendre en compte le même numéro de version de python et génère les fichiers de documentation accessible en ligne (web) ou localement accessible sur un navigateur à l 'adresse http://localhost:7464/ après lancement du serveur python

C:\Python24\Tools\Scripts\pydocgui.pyw 

ou en ligne .Après installation d'un module ( mysql, geopy...); il faut tester le module en ouvrant une fenêtre par Démarrer|executer|python puis en tapant import suivit du nomduModule ( en faisant attention à la case : majuscule/minuscule) si apparrait "ImportError:No module named nomduModule" alors le module n'est pas installé (voir exemple ci dessous pour driver MS SQL

>>>import pymssQl
Traceback (most recent call last): 
 File "<pyshell#1>", line 1, in -toplevel-
     import pymssQl
ImportError: No module named pymssQl

.


  • ez_setup (py),cliquer sur celui ci entraine l installation du fichier PYTHON_HOME\Scripts\easy_install.exe qui va être appeler par
installer module
easy_install.exe /x/y.egg 
easy_install.exe http://wwww.domainname.lang/directory/z.tar.gz
tester installation de ez_setup 
>>> import pkg_ressources 
>>>

ez_setup et donc easy_install.exe fait en une ligne les lignes suivantes

>>>wget http://pexpect.sourceforge.net/pexpect-2.3.tar.gz
>>>tar xzf pexpect-2.3.tar.gz
>>>cd pexpect-2.3
>>>sudo python ./setup.py install


  • ipython est un shell en python non porté sous vista et surpportant ...... la complétion et la colorisation si les modules Readline (download) basé sur ctypes (download) sont installés.L'utilisation de ces fonctionnalités se font par touche <tab> situé à gauche du a de azerty sur le clavier(web)
 C:\Python24\Scripts\easy_install.exe  http://ipython.scipy.org/dist/ipython-0.7.3-py2.4.egg
 PATH=path du  répertoire contenant le fichier  ipython.exe
 c:\Python24\Scripts\ipython.exe
tester par exemple sur Manifold.Mapserver par 
In [1]: import win32com.client
In [2]: d=win32com.client.Dispatch("Manifold.MapServer")
In [3]: d.<tab><enter>
d.CLSID .........
In [4]: d.CLSID
Out[5]: IID('{3F343549-7ABF-11D5-BAFA-00A0C98DED6D}')

pour avoir la completion taper ceci dans le shell

 >>> import rlcompleter, readline
 >>> readline.parse_and_bind('tab: complete')

installation des modules

  • ---MySQLdbpossède un driver python de nom MySQL-python-1.2.2.win32-py2.4.exe(download,web) respectant la norme DB-API permettant a partir d'un script python de se connecter à mysql (web ).mysqldb supporte de nombreux drivers (web).

Image:Manifold_mysql_python.jpg

>>> import MySQLdb
    conn = MySQLdb.connect (host = "localhost",user = "testuser",passwd = "testpass",     db="test")
    cursor = conn.cursor ()
    cursor.execute ("SELECT VERSION()")
    row = cursor.fetchone ()
    print "server version:", row[0]
    cursor.close ()
    conn.close ()
  • ---MS SQL (download) est le driver python d'acces à MS SQL .
 >>> import pymssql 
 >>>
  • ---win32all peut aussi être utilisé pour l'accès au drivers génériques de microsoft ADO(wiki)
>>> db=win32com.client.Dispatch(r'ADODB.connection')#
    DSN="DRIVER={MySQL ODBC 3.51 Driver}; Server=127.0.0.1; Database="+databasename+"; UID=root; PWD="
    db.Open(DSN)
    sql_up ='update  xxxx where   xxx'
    db.Execute(sql_up)
  • geoppy permet de géocoder une adresse.il faut préinstaller BeautifulSoup(download) et l implémentation python de json(web) appelé simplejson (web).Télécharger le fichier geopy (download) dans C:\PYTHON24.Aller dans c:\PYTHON24 puis lancer
C:\PYTHON24\SCRIPTS\easy_install.exe  http://www.crummy.com/software/BeautifulSoup/download/BeautifulSoup.tar.gz 
tester avec
>>> import BeautifulSoup
>>> 

Image:BeautifulSoup_install0.png

C:\PYTHON24\SCRIPTS\easy_install.exe  C:\PYTHON24\simplejson-1.5-py2.4.egg
tester avec 
>>> import simplejson
>>> 

Image:simplejson_install0.png

C:\PYTHON24\SCRIPTS\easy_install.exe ./geopy-0.93-py2.4.egg . 
tester par 
>>>  "from geopy import geocoders
>>>
voir tutoriel sur geocodage (sigplus) et geopy (web).

Image:geopy_install0.png

On peut vérifier la version de python installée depuis window xp ou manifold (flash)

  • D'autre module en rapport à la cartographie peuvent être installer comme

ajouter ou supprimer des programmes

Image:Manifold_python0.jpg

COM et python

Microsoft propose des outils de nom aximp.exe et tlbimp.exe qui permet de générer a partir d'assembly les dll utilisable par pyhton après intallation du module win32all et chargement des dll dans le GAC, dans le répetoire de stockage des assemnlies de PythonNEt ou accessible dans PYTHONPATH.

  • pywin32 ( anciennement win32all )wiki,download 4.2Mo).Tester avec la commande "import win32com".
>>>  import win32com

Ce script permet d'appeler des dll natif a microsoft.


shell python et manifold

Le problème est que l'accès a Manifold depuis l'extérieur est limité car

  • l'acces http nécessite un serveur web qui ne peut être que IIS ( on attend mono-xsp et ironpython-django )
  • ui scripting n'est pas utilisable par shell python et serveur web
from win32com.client import Dispatch
manifold=Dispatch('Manifold.Application')
document=manifold.ActiveDocument
document.Open("C:\\test.map", False, False")
query=document.NewQuery('testquery')
query.Text='SELECT * FROM [Nord Drawing]'
table=query.Run()

python et serveur web

un serveur web peut être lancer depuis django sans serveur web ou avec le serveur web apache grace a mod_python.

geodjango os

  • Quelques articles discutent des problèmes rencontrés en utilisant python coté serveur (web).
  • geodjango est codé en python mais des test avec ironpyhton fonctionne
  • geodjango s utilise au sein de apache avec mod_pyhton ou directement depuis un répertoire window
  • py peut contenir un code python ou ironpython !!


enregistrer une class dans mysql

créer le repertoire racine ou le projet de nom djangos 
-django-admin.py startproject djangos
aller dans djangos et créer une application de nom pole
-python manage.py startapp pole
editer djangos/polls/models.py 
from django.db import models
class Poll(models.Model):
   question = models.CharField(max_length=200)
   pub_date = models.DateTimeField('date published')
class Choice(models.Model):
   poll = models.ForeignKey(Poll)
   choice = models.CharField(max_length=200)
   votes = models.IntegerField()
ajouter l application au porjet en editant django/setting.py
ADMINS = (
   # ('root', 'autre'),
)
MANAGERS = ADMINS
DATABASE_ENGINE = 'mysql'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
DATABASE_NAME = 'django'             # Or path to database file if using sqlite3.
DATABASE_USER = 'root'             # Not used with sqlite3.
INSTALLED_APPS = (
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.sites',
   'django.polls'
)
voir le SQL sans l executer dans mysql 
-python manage.py sql polls
executer la requête SQL dans mysql 
-python manage.py syncdb
regarder comment est stocker les classes dans mysql . mysql joue le rôle de zodb de zope !! 
Image:Django_packagestorage.jpg

tester shell et web

  • pour tester le web
lancer le serveur web python
-python manage.py runserver 
lancer firefox ert aller sur 
-[http://127.0.0.1:8000/]

Image:Django_launch.jpg

  • pour tester e nmode shell
python manage.py shell
voir ici

appliquer les changements

a chaque modification de setting.py urls.py il faut relancer manage.py

  • ajouter dans mysite/settings.py a l interieur de INSTALLED_APPS la ligne 'django.contrib.admin'
  • décommenter dans mysite/urls.py 1-from django.contrib import admin et 2 admin.autodiscover()
  • lancer python manage.py syncdb pour mettre a jour mysql

image:Django_admin_web.jpg

  • n'oublier pas que mysite/settings.py doit contenir
ROOT_URLCONF = 'mysite.urls'

mod_python apache

>>> import mod_python
>>> mod_python.version ( appear since 3.2 mod_python version) 
'3.2.10'

explication ici

  • si apache 2.0 => mod_pyhton 3.0
  • si apache 1.3 2.0 => mod_pyhton 3.0
  • si apache 2.2 => mod_pyhton 3.2.10

Image:mod_pyhton_installpath.jpg le répertoire apache est le repertoire contenant le repertoire de nom module !! pour easyphp C:\Program Files\EasyPHP 2.0b\apache\

 Important Note for Windows users, PLEASE READ!!!
 1. This script does not attempt to modify Apache configuration,
          you must do it manually:
          Edit C:/Program Files/EasyPHP 2.0b/apache\conf\httpd.conf,
          find where other LoadModule lines are and add this:
               LoadModule python_module modules/mod_python.so
 2. Now test your installation using the instructions at this link:
          http://www.modpython.org/live/current/doc-html/inst-testing.html

suivre la configuration et le principe des répertoires d' apache

apache.conf:

 LoadModule python_module "C:/Program Files/EasyPHP 2.0b/apache/modules/mod_python.so"
 Alias /monsiteapache  "C:/Program Files/EasyPHP 2.0b/www/monsiteapache" 
 <Directory "C:/Program Files/EasyPHP 2.0b/www/monsiteapache"> 
       #Options Indexes FollowSymLinks
       AddHandler mod_python .py
       #AddHandler python-program .py
       PythonHandler mptest 
       PythonDebug On 
 </Directory>


déposer ce fichier C:\Program Files\EasyPHP 2.0b\www\monsiteapache\mptest.py contenant

  from mod_python import apache
  def handler(req):
       req.content_type = 'text/plain'
       req.write("Hello World!")
       return apache.OK

aller sur le site http://127.0.0.1/monsiteapache/mptest.py

geodjango

vérifier que tout fonctionne ici

On va ajouter le projet test_geodjango et dedans l' application testapp. ( sont des nom de repertoires)

python et Zope

  • La dernière version 3.3 de zope (download) ou la surcouche plone (download) compatible Zope 2.9 (download) et Python 2.4.
  • Certaines version de zope n'installe pas python .Dans ce cas zope propose d'installer des packages dans les différentes version de python installée.
  • L'instalation de Zope installait python et zope dans un répertoire différent de python.Dans les versions plus récentes, zope s'installe comme un module à python dans le répertoire C:\Python24\Lib\site-packages\zope. Cette facon de faire simplifie l'installation de python et des ses modules.
  • L'installation de zope n'installe pas le serveur, il permet seulement d'avoir accès aux modules permettant de créer le serveur (instance).Le module essentiel a pour nom C:\Python24\Lib\site-packages\zope\app\server\mkzopeinstance.
  • Zope n'a pas accès à mysql depuis la ZMI (IDE en html/javascript) , il faut installer un pont entre zope et python .
  • Les modules pour zope sont appelé des packages et existent seulement sous forme de fichiers archives.Ces fichiers sont a détarer dans le répertoire de Zope (C:\Program Files\zope\2.9.6\Zope\lib\python\Products ) ou des instance de zope.Le fichier a pour nom ZMySQLDA-*.tar.gz.Ainsi l acces a mysql se fait par
mysql--(odbcdriver) -->Xp--(Myodbc)-->python--(mysqlDA)-->zope
  • Installer des product entraine lors du nouveau lancement de zope la compilation de fichier dans le nouveau répertoire ( chaque fichier py cré un fichier pyc ).
  • les scripts créés dans la ZMI de zope peut avoir accès à l 'API de manifold en utilisant les "internals methods" avec win32all.
a installer DISUTILS OS module python package zope
zope (3.3.1) 2.4.1 néc python 2.4.4 python (2.4.4)(download)
pywin(web)
odbc (web) modules (web) mysqql (web) mysqlDA
  • mysqlDA s'installe dans c:\Python24\zopeskel\src et se configure dans c:\Python24\zopeskel\etc\mysqldbda-configure.zcml ou se trouve <include package='mysqldbda' />
  • pywin pywin32 (210), disutil 2.5.0 a besoin de python 2.4.4 et installe
  C:\windows\system32\pythoncom24.dll et pywintypes24.dll 
  C:\Python24\Lib\site-packages\win32com\gen_py


logiciel compatible python

eclipse pydev

C'est un projet libre dont la licence fonctionne sur une licence annuelle ou bi-annuelle comme manifold gis système [4]

La mise à jour se fait en utilisant l'update manager: http://www.fabioz.com/pydev/updates

netbeans 6.5

netbeans version 6.5 utilise en interne une version python pour fonctionner et supporte plusieurs langage python . etant gratuit , on va privilègier sont utilisatin sur de solutions libres.Il nécessite d'installer java .

manifold

  • Tous les versions python fonctionnent ansi que les interfaces graphiques gtk et autre si celles ci sont installées.
  • Si plusieurs versions python installés,Manifold comme xp n'active qu'une des versions installées.La version active est celle qui s éxecute sous xp en lancant Démarrer|executer|python. Cette version nécessite l'installation du package pywin qui install pyhtoncomxx.dll et pywintypesxx.dll dans C:\Pythonxx\Lib\site-packages\pywin32_system32\. xx est la version de python et peut être égale à 24.

Image:Manifold_python0.png manifold avec python 24


  • manifold propose par défaut lors du choix du langage utilisé un script implémentant le célèbre script hello,Word!.Python peut ête utilisé coté client et serveur .


Celui ci ne fait pas appel aux modules qui doivent être initialisées au début du script. Au lieu d'utiliser un module de géocodage de manifold ; on va utiliser le module geopy dont l'installation a été décrite plus haut puis montrer l utilisation de l'api manifold. Des examples de script en vbscript existent ( sigplus).

default

  • Ce script est celui proposé par defaut lors de la création d'un nouveau script.
def Main():
	Application.MessageBox("Hello, World!", "Script")

module interne

  • Python propose par defaut des modules qui sont préinstallés contrairement aux drivers d'acces aux base dedonnées comme mysql,MSSQL dont l'installation est détaillé ci dessus.L'exemple ci dessous montre comment appelé la fonction floor du module math(doc).
import math
def Main():
   Application.MessageBox(str(math.floor(2.132)), "Script")

module python geopy

  • Le module python geopy peut etre appelé depuis manifold pour géocoder une adresse.
from geopy import geocoders 
def Main():
       ve = geocoders.VirtualEarth()  
       place, (lat, lng) = ve.geocode("Microsoft HQ in Redmond, WA") 
       Application.MessageBox(place+" "+str(lat)+" "+str(lng), "Script")

python et usermanual 7x

  • chaque variable du script est un lien vers la documentation pour montrer deux objets principaux: drawing geom et liste d'objets (xxSet).
  • Le modèle objet de manifold se trouve au format png.
def Main():
   Application.MessageBox("Hello, World!", "Script")
   comps=Application.ActiveDocument.componentSet("POINT")
   Application.MessageBox(comps.TypeName,"Drawing")
   i=0
   g=comps.objectSet.Item(i).Geom
   Application.MessageBox(g.ToTextWKT(),"t")#Point Type
   bs=g.BranchSet
   ps=bs.Item(0).PointSet
   poi=ps.Item(0)
   #changement de la valeur du point
   poi.X=710000.704998007 # lon 1.6277
   poi.Y=2600000.12576877 # lat 50.4844
   #ajout d'un nouveau point
   test=Application.NewPoint()
   test.X=770000
   test.Y=2660000
   comps.ObjectSet.Add(Application.NewGeom(0,test))

script SQL

  • L'écriture de requête SQL dans python doit se faire de cette facon pour éviter une erreur d'éxecution du à la présence de guillement dans la variable
var="l'h"
ok ....SQL='select * from table where var="'+val+'"'=>select * from table where var="l'h"
pas ok SQL="select * from table where var='"+val+"'"=>select * from table where var='l'h'