Python
Python
Python
Sommaire
Introduction
Bases du langage
Oprateurs et expressions
Structures de contrle
Fonctions
Modules
Structures de donnes
GUI
Fichiers
Exceptions
2
1
Python
Sommaire (2)
Processus
Regexp
P.O.O
Syntaxe avance
Aide au dveloppement
Runtime
Accs aux SGBD
Accs rseau
Dploiement d'applications et packages
Intgration C/C++
Versions futures
3
Python
2
Introduction
Introduction
Historique
Caractristiques du langage
Installation
Premier programme
Introduction
Historique
3
Introduction
Caractristiques du langage
Portable
Supporte toute taille de programme
Syntaxe simple avec types de donnes volus
Gestion automatique des ressources
LOO avec multi-hritage et surcharge des oprateurs
Gestion des exceptions
Langage dynamique, orthogonal, rflectif et introspectif
Typage dynamique des donnes
Richesse de la bibliothque standard
7
Introduction
Applications types
Scripts d'administration
Scripts pour Internet (CGI, XML, email, Zope/Plone,
Twisted...)
GUI (Tk, wxPython, Qt, Gtk...)
Integration de composants (C/C++...)
Accs aux SGBD
Programmation distribue (CORBA, COM, .NET, SOAP,
XML-RPC)
Dveloppement et prototypage rapide
Analyseurs de langage (parsers)
Traitement d'images, IA, jeux...
8
4
Introduction
Installation
Dj install sur Linux
test par :
$ python -V
Python 2.6.4
Pour Windows
voir www.python.org/download
test par :
PATH=%PATH%;C:\Python26
Python -V
Introduction
10
5
Introduction
Introduction
Lancement de l'interprteur
En mode interactif :
python
>>> import this
Avec une commande excuter :
python -c "print 'coucou'"
En activant un module comme un script :
python -m module ["commande..."]
12
6
Introduction
Personnalisation du prompt
13
Introduction
Obtenir de l'aide
Si la variable d'environnement PYTHONDOCS
est positionne sur le rpertoire contenant les
docs, python peut afficher de l'aide en ligne :
$ export PYTHONDOCS=/usr/share/doc/python-2.4.3
$ python
>>> help('print')
----------------------------------------------------------
6.6 The print statement
14
7
Introduction
15
Introduction
8
Python
17
Bases
Valeurs litrales
Nombres :
entiers : 2
flottants (double prcision): 3.23, 52.3E-4
complexes : (-5 + 1j), (2.3 - 4.6j)
Chaines :
'exemple de chaine'
"pas de pb comme d'habitude"
'''texte sur plusieurs
lignes'''
peut aussi utiliser les triples guillemets """
18
9
Bases
Chaines (suite)
Caractre d'chappement \ :
'l\'alphabet'
"chaine1\nchaine2"
"chaine1\
chaine2"
Chaine sans traitement (raw string) :
r"le \n n'est pas interprt"
R"idem"
Chaine Unicode :
u"chaine1"
U"chaine2"
Les chaines sont immuables
La concatnation est automatique
19
"chaine1" "chaine2"
Bases
Variables - Identifieurs
Sont des catgories d'identifieurs
le 1er caractre doit tre une lettre (min/maj) ou un
soulign (_)
les autres caractres autoriss sont des lettres, des
chiffres ou le soulign
les noms sont sensibles la casse
norme "PEP 8"
20
10
Bases
Exemple d'utilisation
# Fichier var.py
i = 5
print i
i = i + 1
print i
s = '''ligne multiple
voici la deuxieme ligne.'''
print s
Rsultat de l'excution:
$ python var.py
5
6
ligne multiple
voici la deuxieme ligne.
21
Bases
22
11
Bases
Indentation
Certains espaces sont importants !
Les espaces (et les tabulations) en dbut de
ligne dfinissent l'indentation
L'indentation dfinit les blocs d'instructions
Les instructions possdant la mme indentation
successive appartiennent au mme bloc
Exemple d'erreur :
i = 5
print "valeur de i=", i
^
SyntaxError: invalid syntax
23
Bases
Commentaires
Dbutent par un #
Ou bien sont encapsuls par des triples quotes
ou guillemets
# un commentaire
i = 5 # commentaire !
24
12
Python
25
Oprateurs
Oprateurs
Astuce : python value directement les
expressions
>>> 2 + 3
5
+ : ajoute 2 objets
>>> 3+5
8
>>> 'a' + 'b'
'ab'
- : soustraction
26
13
Oprateurs
Oprateurs (2)
* : multiplication
>>> 2*3
6
'ab' * 3
'ababab'
** : puissance
/ : division
>>> 4/3
1
>>> 4.0/3
1.333333333
27
Oprateurs
Oprateurs (3)
// : (floor) arrondi infrieur du quotient
>>> 4 // 3.0
1.0
% : module (reste de la division)
>>> 8 % 3
2
>>> 25.5 % 2.25
0.75
<< : dcalage gauche
>> : dcalage droite
28
14
Oprateurs
Oprateurs (4)
& : "et" binaire
| : "ou" binaire
^ : "ou" exclusif
~ : complment un (= -(x+1))
<, >, <=, >=, ==, != : test d'ingalit
retournent 1 (True) ou 0 (False)
criture v1 < v2 <= v3 possible !
not : ngation boolenne
and : "et" logique
or : "ou" logique
retournent la dernire expression "vraie" 29
Oprateurs
15
Oprateurs
31
Oprateurs
32
16
Oprateurs
Cas du and et du or
33
Oprateurs
Affectations
Affectation simple :
a = 1
Affectations multiples :
a,b = 1,2
Affectations composes :
a += 3
a -= 1
34
17
Python
35
Instructions
Types d'instructions
Python supporte 3 instructions de contrle :
le test avec if
(pas de switch)
la boucle for
la boucle while
36
18
Instructions
Le "if"
#!/usr/bin/python
# Fichier: if.py
number = 23
guess = int(raw_input('Donnez un entier : '))
if guess == number:
print "Bravo !"
elif guess < number:
print "Non, trop petit !"
else:
print "Non, trop grand !"
print "Fin"
37
Instructions
L'criture :
x = true_value if condition else
false_value
est quivalente :
if condition:
x = true_value
else:
x = false_value
38
19
Instructions
Le "while"
#!/usr/bin/python
# Fichier: while.py
number = 23
running = True
while running:
guess = int(raw_input('Donnez un entier : '))
if guess == number:
print "Bravo !"
running = False
elif guess < number:
print "Non, trop petit !"
else:
print "Non, trop grand !"
else:
print "boucle finie" # pas sur un break
print "Fin"
39
Instructions
Le "for"
#!/usr/bin/python
# Fichier: for.py
for i in range(1,5):
# boucle de 1 4
print i
else:
print "boucle finie"
40
20
Instructions
Le "break"
#!/usr/bin/python
# Fichier: break.py
while True:
s = raw_input('Entrez qqc : ')
if s == 'quit':
break
print "la longueur de la chaine est ",len(s)
else:
print "pas excut en cas de break"
print "Fin"
41
Instructions
Le "continue"
while True:
s = raw_input('Entrez qqc : ')
if s == 'quit':
break
if len(s) > 3:
continue
print "chaine de longueur insuffisante"
print "Fin"
42
21
Instructions
L'instruction pass
#!/usr/bin/python
# Fichier: pass.py
a = 10
if a > 11:
# bloc vide, mais syntaxe OK
pass
else:
print "OK"
43
Python
44
22
Fonctions
Introduction
45
Fonctions
Exemple de fonction
#!/usr/bin/python
# Fichier: fonction1.py
def ditBonjour():
print "Bonjour tous !"
# Fin du bloc = fin de la fonction
# Appel de la fonction
ditBonjour()
46
23
Fonctions
#!/usr/bin/python
# Fichier: fonction2.py
def printMax(a,b):
if a > b :
print "le plus grand est ", a
else:
print "le plus grand est ", b
# Appel de la fonction
printMax(3,4)
x = 5
y = 7
printMax(x,y)
47
Fonctions
#!/usr/bin/python
# Fichier: fonction3.py
def fonction(x) :
print "x vaut ",x
x = 2
print "x vaut ",x
x = 50
fonction(x)
print "x vaut ",x
48
24
Fonctions
def fonction() :
global x
print "x vaut ",x
x = 2
print "x vaut ",x
x = 50
fonction()
print "x vaut ",x 49
Fonctions
#!/usr/bin/python
# Fichier: fonction5.py
affiche("coucou")
affiche("bye ",2)
50
25
Fonctions
print f(1)
print f(2) # les args sont accumuls
print g(1)
print g(2) 51
Fonctions
Paramtres nomms
#!/usr/bin/python
# Fichier: fonction6.py
func(3,7)
func(25,c=24)
func(c=50,a=100)
52
26
Fonctions
L'instruction return
#!/usr/bin/python
# Fichier: fonc_return.py
def maximum(x,y):
if x > y:
return x
else:
return y
print maximum(2,3)
53
Fonctions
def f():
print "avant appel de g()"
g() # OK
def g():
print "dans g()"
54
27
Fonctions
Les DocStrings
Syntaxe spcifique qui permet d'auto-
documenter les programmes
La ligne sur la 1re ligne logique d'une fonction
est sa docstring
par convention, la docstring est une chaine s'talant
sur des lignes multiples
la 1re ligne dbute par une majuscule et termine par
un point
la 2me ligne est vide
55
Fonctions
def printMax(x,y):
'''Affiche le max de 2 valeur.
if x > y:
print "le max est ",x
else:
print "le max est ",y
printMax(3,5)
print printMax.__doc__
28
Fonctions
57
Python
58
29
Modules
Introduction
59
Modules
Utilisation de modules
#!/usr/bin/python
# Fichier: using_sys.py
import sys
for i in sys.argv:
print i
30
Modules
Fichiers compils
Pour gagner du temps lors de l'importation, il est
possible de compiler les modules
Les modules compils portent l'extension .pyc
le fichier "compil" contient la date de dernire modification du
fichier source
chaque chargement du fichier source (.py), une tentative est
faite pour crer le fichier .pyc
L'option -O de python produit un fichier .pyo
supprime les "assert"
.pyc et .pyo procurent un gain de temps au
chargement
61
Modules
L'instruction from...import
31
Modules
Modules
Chemins relatifs
64
32
Modules
#!/usr/bin/python
# Fichier: using_name.py
if __name__ == '__main__':
print "Le module est appel directement"
else:
print "Le module est import par un autre module"
65
Modules
Ecrire un module
def ditBonjour():
print "Salut tous !"
version = '0.1'
#!/usr/bin/python
# Fichier: module1_demo.py
import module1
module1.ditBonjour()
print 'Version=',module1.version
66
33
Modules
La fonction dir()
Modules
Packages
34
Modules
69
Modules
35
Modules
Librairies standard
Traitement de chaines :
string, re, stringIO, difflib...
Types de donnes :
datetime, calendar, deque, collections, heapq,
array, set, sched, mutex, Queue...
Traitement numrique et mathmatique :
math, cmath, decimal, random, functools,
itertools...
Donnes de l'Internet :
email, mailbox, mimetools, rfc822, base64, uu...
Traitement *ML :
HTMLParser, htmlparser, xml.parsers, xml.dom,
xml.sax,
71
Modules
36
Modules
Modules
GUI avec Tk
Internationalisation :
gettext, locale
Outils de dveloppement :
pydoc, doctest, unittest, debugger, profiler
74
37
Python
75
Structures
Introduction
76
38
Structures
Structures
Les listes
78
39
Structures
Exemple de liste
#!/usr/bin/python
# Fichier: liste1.py
# ma liste de courses:
maliste = [ 'pomme', 'mangue', 'carotte', 'banane' ]
print "J'ai une liste de ",len(maliste)," lments."
print "Ces lments sont:', # voir la boucle...
for item in maliste:
print item,
maliste.sort()
print "La liste est trie: ",maliste
Structures
80
40
Structures
Exemple de tuple
#!/usr/bin/python
# Fichier: tuple1.py
81
Structures
#!/usr/bin/python
# Fichier: tuple2.py
age = 2
nom = "Dupont"
82
41
Structures
Les Dictionnaires
Structures
Exemple de dictionnaires
#!/usr/bin/python
# Fichier: dict1.py
# un carnet d'adresses:
ca = { 'bob' : '[email protected]',
'alice' : '[email protected]'
}
print "L'adresse d'alice est: %s" % ca['alice']
42
Structures
85
Structures
Exemple d'ensemble
panier = ['pomme', 'orange', 'pomme', 'poire', 'orange', 'banane']
fruit = set(panier) # supprime les doublons
print fruit
# affiche set(['orange', 'poire', 'pomme', 'banane'])
print 'orange' in fruit
# affiche True
print 'cerise' in fruit
# affiche False
a = set('abracadabra')
b = set('alacazam')
print a # lettres uniques de a
# affiche set(['a', 'r', 'b', 'c', 'd'])
print a - b # lettres dans a mais pas dans b
# affiche set(['r', 'd', 'b'])
print a | b # lettres dans a ou b
# affche set(['a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'])
print a & b # letters dans a et b
# affiche set(['a', 'c'])
print a ^ b # lettres dans a ou b mais pas les 2
# affiche set(['r', 'd', 'b', 'm', 'z', 'l'])
86
43
Structures
Les squences
Structures
Exemple de squences
#!/usr/bin/python
# Fichier: seq1.py
# indexation
print "Fruit 0: ", fruits[0]
print "Fruit 1: ", fruits[1]
print "Dernier fruit: ", fruits[-1]
print "Avant-dernier fruit: ", fruits[-2]
# Tranche de liste
print "Fruits 1 3: ", fruits[1:3] # 3=n d'arrt
print "Fruits partir de 2: ", fruits[2:]
print "Du 1er l'avant-dernier: ", fruits[1:-1]
print "Tous les fruits: ", fruits[:]
44
Structures
#!/usr/bin/python
# Fichier: seq2.py
89
Structures
for k, v in seq.iteritems():
print k, v
for i in reversed(xrange(1,10,2)):
print i
90
45
Structures
91
Structures
Comparaisons de squences
92
46
Structures
Les rfrences
93
Structures
Objets et rfrences
#!/usr/bin/python
# Fichier: reference.py
del fruits[0]
47
Structures
if nom.startswith('Rol'):
print "OK, le nom commence par 'Rol'"
if 'o' in nom:
print "OK, le nom contient n 'o'"
if nom.find('tone') != -1:
print "OK, le nom contient la chaine 'tone'"
delimiteur = '_*_'
liste = [ 'France', 'Italie', 'Espagne' ]
print delimiteur.join(liste)
print nom[0]
95
Structures
48
Structures
Programmation fonctionnelle
Structures
Exemples
def f(x): return x % 2 != 0 and x % 3 != 0
print filter(f, range(2, 25))
# affiche [5, 7, 11, 13, 17, 19, 23]
seq = range(8)
def add(x, y): return x+y
print map(add, seq, seq)
# affiche [0, 2, 4, 6, 8, 10, 12, 14]
49
Structures
Petit quizz
Qu'affiche
print list[0].split()[-1]
si list vaut :
list = [ "jean dupont", 42,3000 ]
quelles sont les erreurs ?
animal = "chat"
animal[0] = 'C'
animal = animal.capitalize()
99
Python
100
50
GUI
Interfaces textuelles
101
GUI
Interfaces graphiques
102
51
Tkinter
Tkinter
Widget, BaseWidget :
gre une widget et ses descendants
Misc :
gestion des actions, des timers, focus, couleurs...
Pack, Grid, Place :
gestionnaires de placement des widgets
104
52
Tkinter
#!/usr/bin/python
# Fichier: tkinter1.py
105
Tkinter
def changeColor():
"Changement aleatoire de la couleur du trace"
global coul
pal =
['purple','cyan','maroon','green','red','blue','orange','yellow' ]
c = randrange(8) # genere un nb aleatoire de 0 a 7
coul = pal[c] 106
53
Tkinter
# variables globales:
x1,y1,x2,y2 = 10,190,190,10 # coordonnees de la ligne
coul = 'dark green' # couleur de la ligne
fen1.mainloop()
fen1.destroy() 107
Tkinter
Rsultats de l'excution
108
54
Tkinter
Tkinter
Exemple de positionnement
#!/usr/bin/python
fen = Tk()
fen.wm_title("Demo")
label1 = Label(fen,text="Bonjour")
but1 = Button(fen,text="Bouton1")
but2 = Button(fen,text="Bouton2")
label2 = Label(fen,text="au revoir")
label1.pack(anchor=N,padx=5,pady=5)
but1.pack(anchor=W,fill=X)
but2.pack(anchor=E)
label2.pack(anchor=S,padx=5,pady=5,expand=1)
fen.mainloop() 110
55
Tkinter
Tkinter
Exemple de positionnement
#!/usr/bin/python
from Tkinter import *
fen = Tk()
fen.mainloop() 112
56
Tkinter
Tkinter
Objectif :
raliser une "calculatrice"
Mthodes mises en jeu :
BaseWidget.configure()
configure une widget
BaseWidget.bind()
lie une action utilisateur une fonction
eval()
value du code Python dans un script
114
57
Tkinter
Calculatrice basique
#!/usr/bin/python
def evaluer(event):
chaine.configure(text = "Resultat = " +
str(eval(entree.get())))
fenetre = Tk()
entree = Entry(fenetre)
entree.bind("<Return>",evaluer)
chaine = Label(fenetre)
entree.pack()
chaine.pack()
fenetre.mainloop()
115
PyGTK
Introduction PyGTK
58
PyGTK
1er programme
#!/usr/bin/python
# example base.py
import pygtk
pygtk.require('2.0')
import gtk
class Base:
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.show()
def main(self):
gtk.main()
print __name__
if __name__ == "__main__":
base = Base()
base.main()
117
PyGTK
118
59
PyGTK
PyGTK
Exemples d'vnements :
event button_press_event button_release_event scroll_event
motion_notify_event delete_event destroy_event expose_event
key_press_event key_release_event enter_notify_event
leave_notify_event configure_event focus_in_event focus_out_event
map_event unmap_event property_notify_event selection_clear_event
selection_request_event selection_notify_event proximity_in_event
proximity_out_event visibility_notify_event client_event
no_expose_event window_state_event
120
60
PyGTK
121
Python
122
61
Fichiers
Introduction
Modules sys et os
Gestion des rpertoires
Fichiers texte
Fichiers binaires
123
Fichiers
Le module sys
124
62
Fichiers
Fichiers
Le module os
126
63
Fichiers
Le module os (2)
Variables shell : environ
Lancement de programmes : system, popen,
startfile, fork, pipe, exec, waitpid, kill
Fichiers, verrous : read, write, lock
Gestion des fichiers : remove, rename, mkfifo,
mkdir, rmdir, getcwd, chdir, chmod,
getpid, listdir, walk
Portabilit : sep, pathsep, linesep, curdir,
path.split, path.join, path.exists,
path.isdir, path.isfile
127
Fichiers
>>> os.path.isdir("/etc")
True
>>> os.path.isfile("/tmp")
False
>>> os.path.exists("/etc/group")
True
>>> os.path.split("/etc/group")
('/etc','group')
>>> os.path.basename("/etc/passwd")
'passwd'
>>> os.path.abspath("../images")
'/opt/formation/python/images'
128
64
Fichiers
input.close()
#!/usr/bin/python
import os
#!/usr/bin/python
import os input = open("/etc/passwd","r")
for ligne in input.readlines():
# avec un itrateur: print ligne
for l in open("/etc/passwd"):
print l input.close()
129
Fichiers
#!/usr/bin/python
import os
output = open("data.txt","w")
output.write("ligne 1\n")
output.write("ligne 2\n");
output.close()
#!/usr/bin/python
import os
output = open("data.txt","a")
output.write("ligne 3\n")
output.write("ligne 4\n");
output.close()
130
65
Fichiers
Excution de commandes
os.system("cmd")
excute la commande
os.popen(...) permet de connecter les flux
#!/usr/bin/python
import os
pipe = os.popen("/bin/cat","w")
pipe.write("coucou\n")
131
Fichiers
Redirections de flux
132
66
Fichiers
#!/usr/bin/python
buff = StringIO()
buff.write("demo") # supporte write()
temp = sys.stdout
sys.stdout = buff # donc, a marche !
sys.stdout = temp
print buff.getvalue()
133
Fichiers
Fichiers binaires
Ouverts avec "rb", "wb" ou "ab"
\r\n sous Dos est converti en \n en mode texte
67
Fichiers
Exemple d'utilisation
#!/usr/bin/python
fmt = '<3l32s256scc'
len = calcsize(fmt)
print 'la taille d\'un enregistrement est : ',len
input = open(fichier,"rb")
while True:
buff = input.read(len)
if not buff: break
135
Fichiers
O suis-je ?
>>> import os
>>> print os.getcwd()
/chemin/courant
Changer de rpertoire :
>>> from os import chdir
>>> chdir("/nouveau/repertoire")
Lire le contenu d'un rpertoire :
>>> f = os.listdir("/etc")
136
68
Fichiers
Fichiers
# callback:
def lister(dummy,dirname,filesindir):
print '[' + dirname + ']'
for n in filesindir:
print os.path.join(dirname,n)
os.path.walk('.',lister,None)
#!/usr/bin/python
import os
matches = []
69
Python
139
Exceptions
Introduction
140
70
Exceptions
Exemples d'exception
Division par 0 :
>>> print 99/0
ZeroDivisionError: integer division or
modulo by zero
Erreur de syntaxe :
>>> Print "coucou" !"
File "<stdin>", line 1
Print "coucou"
Syntax Error: invalid syntax
141
Exceptions
142
71
Exceptions
#!/usr/bin/python
import os
def existe(fname):
try:
f = open(fname,"r")
f.close()
return 1
except:
return 0
143
Exceptions
#!/usr/bin/python
import sys
try:
s = raw_input('Saisissez qqc : ')
except EOFError:
print '\nVous avez saisi un EOF'
sys.exit()
except:
print '\nUne autre exception a t leve'
print "Fin"
144
72
Exceptions
145
Exceptions
try:
s = raw_input('Saisissez qqc : ')
if len(s) < 3:
raise ShortInputException(len(s),3)
# traitement normal ici...
except EOFError:
print "\nEOF saisi"
except ShortInputException, x:
print "Trop peu de caractres : %d" % (x.length)
else:
print "OK" 146
73
Exceptions
Exceptions
try:
f = file("/etc/group")
while True:
line = f.readline()
if len(line) == 0:
break
time.sleep(2)
print line,
finally:
f.close()
print "Fichier ferm"
148
74
Exceptions
149
Exceptions
WindowsError SyntaxWarning
Warning UserWarning PendingDEprecationWarning
75
Exceptions
Exceptions
#!/usr/bin/python
import warnings
warnings.warn("avertissement 1")
warnings.filterwarnings(
action = 'ignore',
message = '.*',
category = DeprecationWarning,
module = '__main__')
warnings.warn("avertissement 2",DeprecationWarning)
152
76
Python
153
Processus
Introduction
Processus
Threads
IPC
Signaux
154
77
Processus
import os
def child():
print "Coucou de la part du fils - PID = ",os.getpid()
os._exit(0)
def parent():
while 1:
newpid = os.fork()
if newpid == 0:
child()
else:
print "Coucou du parent - PID = ",os.getpid(), \
" - PID-fils = ",newpid
if raw_input() == 'q': break
parent()
155
Processus
78
Processus
import os
parm = 0
while 1:
parm += 1
pid = os.fork()
if pid == 0:
# processus fils
os.execlp('python','python','ex-fils.py',str(parm))
assert False,'erreur de execlp'
else:
print 'Le PID du fils est ',pid
if raw_input() == 'q': break
#!/usr/bin/python
import os,sys
print 'Bonjour, je suis le fils, mon PID est: ',os.getpid()
print '...et mon parametre est: ',sys.argv[1] 157
Processus
Le module thread
#!/usr/bin/python
import thread,time
def counter(myId,count):
for i in range(count):
#mutex.acquire()
time.sleep(1)
print '[%s] => %s' % (myId,i)
#mutex.release()
mutex = thread.allocate_lock()
for i in range(10):
thread.start_new_thread(counter,(i,3))
time.sleep(4)
print 'Sortie du thread principal'
158
79
Processus
Autres mcanismes
Le module threading
repose sur le module thread
implmente une smantique " la Java" (join, lock...)
Le module Queue
FIFO accs synchronis
159
Processus
160
80
Processus
Exemple de multi-threading
#!/usr/bin/python
for i in xrange(10):
# Fichier: prime-thread.py
t = MonThread(q)
t.setDaemon(True)
import threading
t.start()
import Queue
# On remplit la queue:
# Objet de synchro inter-thread
for i in xrange(100):
q = Queue.Queue()
queue.put(i)
class MonThread(threading.Thread):
# On attend que les threads
def __init__(self,q):
# aient fini
super(MonThread,self).__init__()
queue.join()
self.q = q
def run(self):
x = self.q.get()
pass
self.q.task_done()
161
Processus
Le module multiprocessing
Les processus sont des instances de la classe
Process et sont dmarrs par la fonction
start()
imite le fonctionnement du module threading
Ncessite des objets de synchronisation :
Queues, Pipes, Lock...
Les objets Value et Array sont placs dans
des segments de mmoire partags
les manager permettent de partager des
dictionnaires, listes...
La classe Pool permet de crer et grer un
ensemble de "worker process" 162
81
Processus
Exemples de multi-processing
#!/usr/bin/python
def f(name):
print 'hello', name
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
p.join()
import multiprocessing
def ma_fonction(val):
pass
Processus
164
82
Processus
import sys,signal,time
def now():
return time.ctime(time.time())
signum = int(sys.argv[1])
signal.signal(signum,onSignal)
signal.alarm(100) # au cas o !
while 1: signal.pause()
165
Python
166
83
Regexp
Introduction
167
Regexp
Rappels syntaxiques
a, b, ... : expression atomique
. : n'importe quel caractre
[abc], [a-jmn], [^a-k] : ensemble et intervalle
^, $, \b, \B : ancres
*, ?, +, {m}, {m,n} : rptiteurs
? : non-gourmandise (ou paresse)
| : alternative
\n : correspond la valeur d'un groupe entre ()
\xxx, \s, \w.. : classes de caractres
168
84
Regexp
Recherche de bases
La mthode re.match() met en relation un modle et
du texte :
>>> pat = '[ \t]*Bonjour[ \t]+(.*)'
>>> line = "Bonjour tout le monde"
>>> mobj = re.match(pat,line)
>>> mobj.group(1)
'tout le monde'
Regexp
85
Regexp
Options de recherche
Dernier argument de compile, match, search, find*
peuvent tre multiples et spares par des '|'
re.I ou (?i) : ignore la casse des caractres
re.L ou (?L) : les \w, \b, etc... deviennent dpendants de la
localisation (sur 8 bits)
re.M ou (?m) : multilignes
re.S ou (?s) : le . correspond aussi au fin de ligne
re.U ou (?u): les \w, \b, etc... deviennent dpendants des
proprits Unicode
re.X ou (?x) : mode verbeux
171
Regexp
Objet rsultat
172
86
Python
173
POO
174
87
POO
Principe d'abstraction
Exemple:
la classe "figure gomtrique" dfinit que ses objets
possdent des sommets et des artes
les objets "triangles" et "carrs" appartiennent la
classe "figure gomtrique"
175
POO
Principe d'encapsulation
Objectif: cacher l'implmentation de la classe,
en masquant tout ce qui n'est pas un service
propos
Permet de modifier l'implmentation sans
changer l'interface
Notion de visibilit des attributs et mthodes
La visibilit peut tre:
publique, prive, protge
mais avec Python, tout est public !
176
88
POO
Principe d'hritage
Exemple:
la classe "quadrilatre" est drive de la classe
"figure gomtrique" mais elle ajoute une contrainte
supplmentaire sur le nombre d'artes
177
POO
Le polymorphisme
Plusieurs polymorphismes:
polymorphisme d'hritage (mme nom de mthode
mais comportement diffrent)
polymorphisme paramtrique (mme nom de
mthode mais paramtres de types diffrents)
178
89
POO
Nouveaux mots-cls
#!/usr/bin/python
# Fichier: methode1.py
class Personne:
def direBonjour(self):
print "Bonjour !"
p = Personne()
p.direBonjour()
179
POO
Mthodes prdfinies
__init__ est le constructeur
#!/usr/bin/python
# Fichier: methode1.py
class Personne:
def __init__(self,nom):
self.nom = nom
def direBonjour(self):
print "Bonjour, je m'appelle ",self.nom
p = Personne("alice")
p.direBonjour()
# ou bien:
Personne("alice").direBonjour()
180
90
POO
#!/usr/bin/python
# Fichier: methode1.py
class Personne:
def __del__(self):
print "Au revoir !"
def direBonjour(self):
print "Bonjour !"
p = Personne()
p.direBonjour()
del p
181
POO
Variables de classes
Ce sont simplement des variables dfinies dans
l'espace de nommage (de visibilit) de la classe
#!/usr/bin/python
# Fichier: objvar.py
class Personne:
population = 0
def __init__(self,nom):
Personne.population += 1
self.nom = nom
def __del__(self):
Personne.population -= 1
p = Personne('alice')
p.direBonjour()
print Personne.population
del p 182
91
POO
#!/usr/bin/python
# Fichier: heritage.py
class Mammifere:
car1 = "allaite ses petits"
class Carnivore(Mammifere):
car2 = "mange ses proies"
class Chien(Carnivore):
car3 = "il aboie"
medor = Chien()
print medor.car1, medor.car2, medor.car3
183
POO
184
92
POO
#!/usr/bin/python
# Fichier: heritage2.py
class Mammifere:
car1 = "allaite ses petits"
class Carnivore:
car2 = "mange ses proies"
class Chien(Mammifere,Carnivore):
car3 = "il aboie"
medor = Chien()
print medor.car1, medor.car2, medor.car3
185
POO
Polymorphisme
#!/usr/bin/python
# Fichier: heritage.py
class Animal:
def faireDuBruit(self):
print "(silence)"
class Chien(Animal):
def faireDuBruit(self):
print "ouaf, ouaf !"
class Chat(Animal):
def faireDuBruit(self):
print "miaou..."
186
93
POO
POO
Attributs privs
Tout est public !
Il faut adopter des conventions de nommage et les
respecter (PEP 8)
Tout nom qui dbute par un _ n'est pas export par un
module (lors d'un from module import *)
Tout attribut dont le nom dbute par __ est dcor avec
_nomclasse
class MaClasse:
i = 1
__priv = 2
print MaClasse.i
print MaClasse.__priv # erreur
print MaClasse._MaClasse__priv # OK !
188
94
POO
Copie d'objets
Pour viter le partage des rfrences, il faut
parfois forcer la copie des objets
Oprateur [:] pour les squences
Methode copy() pour les dictionnaires et les
ensembles
Sinon, importer le module copy et utiliser les
mthodes :
copy() ou deepcopy() (rcursive)
les objets doivent dfinir les mthodes
__copy__(self) et __deepcopy__(self,memo)
189
Python
190
95
Syntaxe avance
Syntaxe avance
Exemple de surcharges
#!/usr/bin/python
# Fichier: overload.py
class UneClasse:
def __init__(self,liste = []):
self.valeurs = liste
def __str__(self):
# doit retourner une chaine
return "Contenu: " + str(self.valeurs)
def __len__(self):
return len(self.valeurs)
# Exemple d'utilisation
obj = UneClasse([1,2,3,4])
print "la 'longueur' de l'objet est: ", len(obj)
print "sa reprsentation est: ", obj
192
96
Syntaxe avance
Comparaisons :
__cmp__(self, other), __eq__, __ne__, __lt__,
__gt__, __le__, __ge__
193
Syntaxe avance
Oprateurs d'affectation :
__iadd__(self,other), ...
194
97
Syntaxe avance
Reprsentation de classes :
__str__(self), __repr__, __unicode__,
__format__(self, formatstr), __hash__,
__nonzero__, __dir__, __sizeof__
195
Syntaxe avance
Rflexivit :
__instancecheck__(self, inst),
__subclasscheck__(self, subclass)
Context Manager :
__enter__(self), __exit__(self, exception_type,
exception_value, traceback) 196
98
Syntaxe avance
Syntaxe avance
Exemple de Descriptor
#!/usr/bin/python
# Fichier: descriptor.py
t = Temperature()
t.farenheit = 450
print t.celsius # conversion automatique !
198
99
Syntaxe avance
Lambda-fonctions
#!/usr/bin/python
# Fichier: lambda.py
def make_repeteur(n):
return lambda s: s * n
deuxfois = make_repeteur(2)
199
Syntaxe avance
Lambda-fonctions (2)
#!/usr/bin/python
# Fichier: lambda2.py
200
100
Syntaxe avance
Exemples :
liste1 = [2, 3, 4]
liste2 = [2*i for i in liste1 if i > 2]
liste3 = [ord(x) for x in 'bonjour']
est quivalent :
liste3 = map(ord,'bonjour')
201
Syntaxe avance
202
101
Syntaxe avance
Syntaxe avance
Expressions gnratrices
Produisent des rsultats similaires aux dfinitions
fonctionnelles, mais sans crer la liste
Agissent comme des itrateurs possdant une mthode
next
Exemples :
>>> carres = (x**2 for x in range(5))
>>> carres
<generator object ...>
>>> carres.next()
0
>>> list (x**2 for x in range(5))
[0,1,4,9,16]
204
102
Syntaxe avance
Syntaxe avance
103
Syntaxe avance
#!/usr/bin/python
# Fichier: varlist1.py
def powersum(power,*args):
'''Retourne la somme de chaque arg lev la
puissance indique par le 1er paramtre'''
total = 0
for i in args:
total += pow(i,power)
return total
print powersum(2,3,4)
print powersum(2,10)
liste = (1,2,3)
print powersum(*liste)
207
Syntaxe avance
#!/usr/bin/python
# Fichier: varlist2.py
#!/usr/bin/python
superfunc(3,1,'toto',couleur='rouge',prix=4)
208
104
Syntaxe avance
import functools
def log(message,categorie):
print '%s: %s' % (message,categorie)
mail_log = functools.partial(log,categorie='mail')
mail_log('pb de boite aux lettres')
209
Syntaxe avance
210
105
Syntaxe avance
Instruction assert
211
Syntaxe avance
Fonction repr
Elle permet d'obtenir une chaine reprsentant un
objet ou une expression
fonction quivalente la forme entre backquotes
>>> i = 4
>>> repr(i)
'4'
>>> repr(2*3)
'6'
>>> `i`
'4'
212
106
Syntaxe avance
Instruction yield
Syntaxe :
yield expression
Suspend la fonction qui la contient et retourne la
valeur de l'expression
A la prochaine itration, l'tat de la fonction est
restaur et l'excution reprend aprs l'instruction
yield def fabrique_entiers(N):
for i in range(N):
yield i
gen = fabrique_entiers(5)
print gen.next()
213
Syntaxe avance
Gnrateurs et itrateurs
Les classes qui implmentent les mthodes
__iter__() et next()sont des itrateurs
__iter__() retourne l'objet itrateur
mthode invoque par l'appel iter(obj)
next() retourne le prochain lment et lve
l'exception StopIteration en fin d'itration
Les fonctions qui contiennent des "yield" sont
compiles en tant que gnrateurs
lorsqu'elles sont invoques, elles retournent un objet
gnrateur qui fournit la mthode next()
214
107
Syntaxe avance
Maintenant :
yield retourne une expression (ce n'est plus une instruction)
la mthode send permet de spcifier la prochaine valeur
retourne par yield
215
Syntaxe avance
108
Syntaxe avance
217
Syntaxe avance
218
109
Syntaxe avance
def __exit__(self,exception_type,exception_value,
exception_traceback):
print "Quitte..."
if exception_type is None:
print "sans erreur !"
else:
print "avec erreur !"
print exception_value
with Context():
print "Je suis dans le contexte"
with Context():
print "je vais provoquer un bug !"
raise TypeError('je suis le BUG')
219
Syntaxe avance
Dcorateurs
Possibilit d'enrober une fonction dans une
autre fonction
def dec1(f):
"Ajoute 1 au rsultat de la fonction dcore."
return _f
@dec1
def carre(x):
return x * x
def main():
print "results from square(3): %s." % carre(3)
220
if __name__ == "__main__": main()
110
Syntaxe avance
Fonctionnement interne
221
Syntaxe avance
def decN(f):
def _f(*args, **kwargs):
y = f(*args, **kwargs)
return y + N
return _f
return decN
ajoute_six = dec2(6)
print ajoute_six(ajoute_deux_nb)(1,2) # affiche 9
ajoute_cinq_a_deux_nb = dec2(5)(ajoute_deux_nb)
print ajoute_cinq_a_deux_nb(1,2)
222
111
Syntaxe avance
Syntaxe avance
Dcorateur memorized
class memorized(object):
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self,*args):
if args in self.cache:
return self.cache[args]
else:
self.cache[args] = value = self.func(*args)
return value
calls = 0
@memorized
def fibonacci(n):
global calls
calls += 1
if n in (0,1):
return n
return fibonacci(n-1) + fibonacci(n-2)
print fibonacci(5)
print calls # affiche 6 au lieu de 15 !
224
112
Syntaxe avance
A = foo(bar(A))
225
Syntaxe avance
Mthodes de classe
exemples d'appels :
C.f()
C().f()
226
113
Syntaxe avance
Mthodes statiques
exemples d'appels :
C.f()
C().f()
227
Syntaxe avance
Introspection
Chaque objet possde les attributs suivants :
__name__ : son nom (if __name__ == '__main__')
__doc__ : sa chaine de documentation
__file__ : le fichier source pour un module
__class__ : nom de la classe d'un objet
__module__ : nom du module o la classe a t
dfinie
__dict__ : dictionnaire des symboles et de leurs
types
Utilisation du module inspect
228
114
Syntaxe avance
__dict__ et __slots__
__dict__ contient la liste des attributs de
l'objet
il est possible de les dfinir dynamiquement
__slots__ dfinit au niveau de la classe, la
liste des attributs autoriss (new style class)
gain d'espace mmoire
impossible de crer des attributs dynamiquement
class C(object):
__slots__ = ( 'x' )
def __init__(self):
pass
c = C()
c.x = 4
c.y = 5 # Exception 229
Syntaxe avance
Autres mthodes
dir()qui renvoie la liste des attributs d'un objet
type()retourne le type d'un objet
id() renvoie l'identit d'un objet
souvenez-vous qu'il peut y avoir plusieurs rfrences un objet
hasattr(obj,attr) et getattr(obj,attr)
isinstance(obj,type) : retourne un boolen qui
indique si l'objet est du type indiqu
issubclass(derive,parent) : indique si une classe
drive d'une autre classe
230
115
Syntaxe avance
Attributs et proprits
Les attributs sont habituellement crs et
initialiss dans __init__()
mais ils peuvent tre dfinis dynamiquement (sauf si
l'objet est immuable : __slots__)
Les proprits sont des mthodes qui s'utilisent
comme des attributs
syntaxe plus simple
smantique d'affectation plus lisible ?
objet.setAttr(x)
objet.attr = x
231
Syntaxe avance
232
116
Syntaxe avance
obj = A()
print obj.attrib
233
Syntaxe avance
@property
def total(self):
return self.x * self.y
@property
def larg(self): return self.x
@larg.setter
def larg(self, x): self.x = x
a = A()
print a.total
a.larg = 5
234
117
Syntaxe avance
Mta-programmation
La mthode __new__ est toujours appele lors
de l'instanciation d'un objet
doit retourner une instance de la classe
peut modifier le comportement de la classe avant ou
aprs la cration de l'objet
appel implicite, mme par les sous-classes
(contrairement __init__)
class A(object):
def __new__(cls):
print "ok"
return object.__new__(cls)
def __init__(self):
print "init"
self.a = 1
235
Syntaxe avance
Mta-programmation (2)
L'attribut __metaclass__ permet de lier la classe une
"Factory" personnalise
appele au lieu de type()
accepte en argument le nom d'une classe, le t-uple de ses
classes de base et le dictionnaire des ses attributs valus
retourne un objet de la classe
def meth(clsname,types_base,dict):
# Faire des choses sur le dict ?
dict['demo'] = "a marche !"
return type(clsname,types_base,dict)
class MaClasse(object):
__metaclass__ = meth
def demo(self):
print "ok"
236
118
Syntaxe avance
Mta-programmation (3)
Ou bien, en utilisant une classe :
class MetaClassDescription(type):
def __meth__(clsname,types_base,dict):
# Faire des choses sur le dict ?
dict['demo'] = "a marche !"
return type.__new__(clsname,types_base,dict)
class MaClasse(object):
__metaclass__ = MetaClassDescription
def __init__(self):
print "dans init"
def demo(self):
print "ok"
237
Python
238
119
Outils
Introduction
Documentation de code
Contrle syntaxique
Debugger
Profiler
239
Outils
Invocation de pydoc :
pydoc nom_fonction
pydoc nom_module
pydoc nom_package
pydoc nom_package.nom_module.nom_classe...
pydoc /chemin/vers/source.py
240
120
Outils
Paramtres de pydoc
241
Outils
121
Outils
Utilisation de pychecker
pychecker [opt] nom_script.py
ou
>>> import pychecker.checker
>>> import mon_module
243
Outils
Pylint
analyse les respects des rgles de nommage (PEP 8)
effectue des analyses de complexit (# param
/fonctions, # instructions/fonctions, etc...)
utilisation :
pylint --generate-rcfile > ~/.pylintrc
pylint monscript.py
CloneDigger
analyse les portions de code similaires
244
122
Outils
Contrle qualit
Outils
Lancement de doctest
246
123
Outils
Options et directives
Possibilits d'ajouter des options dans des
commentaires spciaux :
IGNORE_EXCEPTION_DETAIL :
vrai si le type de l'exception est celui attendu mais le dtail
quelconque
SKIP :
ne joue pas le test. Pour de la doc uniquement
REPORT_UDIFF, REPORT_CDIFF :
format de rapport des erreurs
REPORT_ONLY_FIRST_FAILURE
Exemple :
>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]
247
Outils
248
124
Outils
Exemple d'utilisation
import random
import unittest
class TestSequenceFunctions(unittest.TestCase):
def setUp(self):
self.seq = range(10)
def testshuffle(self):
random.shuffle(self.seq)
self.seq.sort()
self.assertEqual(self.seq, range(10))
def testchoice(self):
element = random.choice(self.seq)
self.assert_(element in self.seq)
def testsample(self):
self.assertRaises(ValueError, random.sample, self.seq, 20)
for element in random.sample(self.seq, 5):
self.assert_(element in self.seq)
if __name__ == '__main__':
unittest.main() 249
Outils
250
125
Outils
Le Debugger
251
Outils
Commandes du debugger
l(ist) [deb[,fin]]: affiche les 11 lignes "courantes"
h(elp) [commande]
w(here) : affiche la pile
d(own), u(p) : dplacement dans la pile
b(reak) [[fichier:]nuligne | fonction[,cond]] et t(break) :
positionne un point d'arrt (temporaire)
cl(ear), disable, enable, ignore, condition, commands :
gestion des points d'arrt
s(tep), n(ext) : excute la prochaine instruction (step-in, next-over)
r(eturn) : sort de la fonction courante
c(ontinue)
j(ump) nuligne
p expression ou pp expression : affiche le rsultat d'une expression
q(uit)
252
126
Outils
Le Profiler
Fournit des statistiques sur l'excution des scripts
Plusieurs modules :
profile : module standard
cProfile : profiler crit en C
hotshot : crit en C, amlior pour la v2.5 (prennit ?)
timeit : mesure de temps d'excution de "petits" scripts
guppy : donne des indications sur l'utilisation mmoire
# easy_install guppy
>>> from guppy imlport hpy
>>> hp = hpy()
>>> print hp.heap()
253
Outils
254
127
Outils
Outils
La classe stats
Exporte les mthodes suivantes :
strip_dirs() : limine les chemins des noms de fichiers
add(fichier) : ajoute les rsultats issus d'un fichier
dump_stats(fichier) : sauve les stats dans un fichier
sort_stats(cl) : les critres de tri peuvent tre multiples et
pris dans : calls, cumulative, file, module, pcalls, line, name, nfl
(name/file/line), stdname, time
reverse_order() : pour un tri ascendant
print_stats(restrictions) : en % et regexp sur nom des
fichiers
print_callers(restrictions) : fonctions appelantes
print_callees(restrictions) : fonctions appeles
256
128
Outils
Outils divers
Performances :
mesurer les pystones
Analyseur de l'tat de la mmoire :
Guppy-PE
easy_install guppy
Heapy
257
Python
258
129
SGBD
Introduction
259
SGBD
#!/usr/bin/python
# Fichier: cPickle.py
import cPickle as p
class Animal:
def __init__(self,nbp,coul):
self.nb_pattes = nbp
self.couleur = coul
a = Animal(2,'gris') del a
f = open("animal.txt","w") f = open("animal.txt","r")
p.dump(a,f) a = p.load(f)
f.close() print a
260
130
SGBD
261
SGBD
Le module anydbm
#!/usr/bin/python
# Fichier: anydbm.py
import anydbm
db['banane'] = 'jaune'
db.keys()
db['banane']
len(db) # affiche 1
db.has_key('banane') # affiche 1
db.close()
262
131
SGBD
263
SGBD
db['obj1'] = obj1
db['complique'] = obj3
db.close()
...
db = shelve.open("dbase")
for k in db.keys():
print k, '=>'
for f in db[k].keys():
print ' ',f,'=',db[k][f] 264
132
SGBD
Contraintes d'utilisation
Les cls doivent tre des chaines
Les objets sont uniques que pour une cl
donne - sinon, ils sont dupliqus
Les mises jour du shelve doivent tre
explicites
Les classes des objets stocks doivent tre
importables
Les modifications des classes doivent tre
compatibles
265
SGBD
Interface SQL
266
133
SGBD
Le module MySQLdb
escape_*(...)
Ajoute de nouvelles exceptions :
DataError, DatabaseError,
InterfaceError, IntegrityError,
MySQLError...
267
SGBD
Classe connection
268
134
SGBD
Classe cursor
Les mthodes principales sont :
execute : excution d'une requte SQL
execute("select * from table where col > %s",
(valeur,))
executemany(req,[('v1','v2'),('w1','w2')]
rowcount : nombre de lignes impactes
fetchall : retourne la liste des lignes sous forme de
tuples de tuples
fetchone : retourne la prochaine ligne de la liste des
rsultats
close : ferme le curseur
269
SGBD
#!/usr/bin/python
# Fichier: mysql1.py
import MySQLdb,sys
cursor = cnx.cursor()
270
135
PyMongo
API Python
Installation :
pip install pymongo
pip-python install pymongo
easy_install pymongo
Mise jour :
pip install --upgrade pymongo
easy_install -U pymongo
271
PyMongo
Connexion au serveur
272
136
SGBD
273
SGBD
storage = FileStorage.FileStorage('/tmp/zodb.db')
db = DB(storage)
connection = db.open()
root = connection.root()
root['machaine'] = 'bon' * 3
root['montuple'] = objet1
root['maliste'] = objet2
root['mondict'] = objet3
get_transaction().commit()
storage.close()
274
137
SGBD
storage = FileStorage.FileStorage('/tmp/zodb.db')
db = DB(storage)
connection = db.open()
root = connection.root()
print len(root),root.keys()
print root['maliste']
print root['mondict']
print root['mondict']['nom'][-1]
get_transaction().commit()
storage.close()
275
SGBD
138
SGBD
class Personne(Persistent):
def __init__(self,nom,age):
self.nom = nom
self.age = age
def changeAge(age):
self.age = age # m.a.j la DB automatiquement
def __str__(self):
return "Nom: %s, age: %d" % (self.nom,self.age)
Python
278
139
Clients Internet
Introduction
Client FTP
Client de messagerie
Client Web
279
Clients Internet
140
Clients Internet
Exemple d'utilisation
import os,sys
from getpass import getpass
nonpassive = False
filename = "boot.iso" # fichier a telecharger
#userinfo = ('jd',getpass("mot de passe ? ")
userinfo = ()
if len(sys.argv) > 1: filename = sys.argv[1]
print 'Connexion...'
from ftplib import FTP
localfile = open(filename,"wb")
cnx = FTP("localhost")
cnx.login(*userinfo)
cnx.cwd("/pub/centos-5.1/images")
if nonpassive: cnx.set_pasv(False)
print "Telechargement..."
cnx.retrbinary('RETR ' + filename,localfile.write,1024)
cnx.quit()
cnx.close() 281
Clients Internet
282
141
Clients Internet
Exemple d'utilisation
import os,sys
import urllib
fname = "boot.iso"
# ou bien:
remotefile = urllib.urlopen(remoteaddr)
localfile = open(fname,"wb")
localfile.write(remotefile.read())
localfile.close()
remotefile.close()
283
Clients Internet
Clients POP3
import poplib,os,sys
server = poplib.POP3("smtp.free.fr")
server.user("Bob")
server.pass_("secret")
try:
msgCount,msgBytes = server.stat()
print "Il y a %d messages dans votre b.a.l", msgCount
finally:
server.quit()
284
142
Clients Internet
Envoyer du courrier
Plusieurs solutions :
en invoquant la commande externe mail :
os.popen('mail -s "sujet"
[email protected]','w').write(msg)
285
Clients Internet
Exemple d'utilisation
import os,sys,time
import smtplib
srv = smtplib.SMTP("smtp.free.fr")
failed = srv.sendmail(From,To,Text)
srv.quit()
if failed: # exceptions possibles
print "Il y a eu des erreurs"
else: print "OK" 286
143
Clients Internet
Client HTTP
Modules disponibles :
httplib (bas niveau)
urllib
urllib2
import sys,os,urllib,urlparse
page = "http://srv/page.php?p=v"
#(scheme,server,path,parms,query,frag) = urlparse.urlparse(page)
rempage = urllib.urlopen(page)
date = rempage.readlines()
rempage.close()
# ou :
# urllib.urlretrieve(page,fichierlocal)
287
Clients Internet
Le module urllib2
288
144
Clients Internet
# Ajout d'enttes:
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
opener.open('http://www.example.com/')
289
Python
290
145
Dploiement
Introduction
distutils
pip
virtualenv
291
Dploiement
Le module distutils
292
146
Dploiement
293
Dploiement
147
Dploiement
Cration du package
On utilise l'option sdist qui cre une archive
partir de l'arborescence originale
$ python setup.py sdist
l'archive (tar.gz) est stocke sous le rpertoire ./dist
d'autres formats sont possible (rpm, bzip2...)
Dploiement
296
148
Dploiement
Installation et dsinstallation
297
Dploiement
298
149
Dploiement
Dploiement
300
150
Virtualenv
Le problme :
les versions successives de Python ne sont pas
toujours parfaitement compatibles
comment faire cohabiter des versions diffrentes de
Python ?
La solution : virtualenv
installation par yum ou aptitude ou pip
301
Virtualenv
151
Virtualenv
Python
304
152
Interface C/C++
Sommaire
SWIG
Cython
305
Interface C/C++
306
153
Interface C/C++
Interface Python / C
307
Interface C/C++
Interface Python / C
308
154
SWIG
Prsentation de SWIG
309
SWIG
Principe de SWIG
/* fichier.c */ /* fichier.h */
int int add(int x, int y);
add(int x, int y) {
return x+y; fichier.c + fichier.h => fichier.o
}
fichier.o => libfichier.so
155
SWIG
Exemple
gcc -c fichier.c -o fichier.o
gcc -shared fichier.o -o libfichier.so
swig -python fichier.i
gcc -c fichier_wrap.c \
-I /usr/include/python \
-o fichier_wrap.o
ld -shared fichier_wrap.o libfichier.so \
-o _fichier.so
mv libfichier.so /usr/lib/
import fichier
fichier.methode(parms)
311
SWIG
156
SWIG
SWIG
Goodies
Outre la traduction de types, SWIG permet :
l'ajout de contraintes
double sqrt(double NONNEGATIVE)
renommage
%rename (print) __str__
en cas de conflit entre le C et Python
la dclaration de variables en lecture seule
%immutable
l'insertion de code
%inline
le passage du fonctionnel l'objet
314
157
Cython
Prsentation de Cython
315
Cython
Principe de Cython
Si on type les fonctions et les variables (ici avec le mot-cl cpdef), le code
gnr est plus performant
Sans le typage, le code est seulement meilleur de 20 35% seulement
316
158
Cython
Exemple
cython fichier.py[x]
gcc fichier.c -I /usr/include/python/ \
-o fichier.so -shared -pthread
import fichier
fichier.add(3,4)
317
Python
318
159
Python 2.6
Introduction
319
Python 2.6
Importations relatives
160
Python 2.6
Python 2.6
Nouveaux packages
multiprocessing
dfinit les objets Process, Queue et les IPC
permet de des processus d'changer et partager
des informations
json
JavaScript Object Notation
de TRES nombreuses modifications dans les
modules dj existants
322
161
Python 2.6
Python 2.6
La signature est :
def print(*args, sep=' ', end='\n', file=None)
162
Python 2.6
Python 2.6
class B(A):
def foo(self): print(42)
B() # OK 326
163
Python
327
Python 2.7
Introduction
328
164
Python 2.7
>>> {1,2,3,4}
set([1,2,3,4])
329
Python 2.7
Comprhension de dictionnaires
330
165
Python 2.7
Vues de dictionnaires
Python 2.7
332
166
Python 2.7
333
Python 2.7
Amliorations diverses
Le module io est prfrable au module file
(utilisation de la fonction open())
meilleures performances
Le module collections propose :
les dictionnaires ordonns (OrderedDict) qui
conservent l'ordre d'insertion
les compteurs (Counter) qui fonctionnent avec les
chaines, les listes, les tuples
Le module argparse analyse les lignes de
commande au lieu de optparse
334
167
Python
335
Python 3.0
Principales modifications
http://docs.python.org/dev/3.0/whatsnew/3.0.htm
De nombreux changements syntaxiques :
print est une fonction
l'oprateur d'affichage % est supprim
les fichiers texte imposent un encodage
nouvelle hirarchie des exceptions (BaseException)
dcorateurs de classes, classes abstraites
fin du <> (!= obligatoire), nouveaux mots-cls (as, with, True,
False, None)
Des fonctions disparaissent, d'autres sont cres
Idem pour les modules
fin de cPickle : pickle obligatoire
336
168
Python 3.2
Principales modifications
Dictionnaires ordonns (3.1+)
De nouveaux modules qui en rendent d'autres obsoltes :
argparse (issu de 2.7 - au lieu de optparse et getopt)
concurrent.futures pour la gestion des threads
Des modules enrichis ou optimiss :
logging (configuration via des dictionnaires)
ensembles (sets), pickle, json, traitement de chaines
Nouveau format de nom pour les fichiers caches (.pyc)
regroups dans le rpertoire __pycache__ du paquet
leur nom contient le nom et la version de l'interprteur
Options de l'interprteur :
option -q (mode silencieux)
option ResourceWarning (-Wdefault) qui avertit sur l'utilisation des
ressources
337
Python 3.0
338
169
Python
Erreurs frquentes
Oubli des ':'
Erreurs d'indentation aprs un reformatage !
Confondre attribut et mthode (oublier les parenthses)
Oublier d'appeler les constructeurs des classes de base
Confondre les ',' et les '+' avec print
Oublier de faire des conversions de chaine en int
Oublier que __repr__() et __str__() retournent des
chaines
Nommer un fichier comme un module Python existant et
l'importer !
339
170