Вы находитесь на странице: 1из 19

Table des matires

Master 1 UE Rseaux Avancs I 1 Pourquoi Python ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2


1.1 Pourquoi Python ? Ses caractristiques
1.2 Pourquoi Python ? Ses usages
2 Un programme Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
3 Structure dun source Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
4 Les variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
5 Les valeurs et types de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
6 Les structures de contrle Instructions & Conditions . . . . . . . . . . . . . . . . . . . . . . . . . 4
6.1 Les structures de contrle Itrations
7 Les oprateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
8 La gestion des caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
9 Les chanes de caractres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
10 Les listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
10.1 Les listes Exemples dutilisation
10.2 Les listes Utilisation comme pile et file
10.3 Utilisation spciale des listes
10.4 Laccs aux lments dune liste ou dun tuple
Montit Python P-F. Bonnefoi 10.5 Des listes comme tableau 2 dimensions
Version du 10 septembre 2012 10.6 Un accs par indice aux lments dune chane
11 Les dictionnaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

12 Les modules et lespace de nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 25 Gestion de processus : lancer une commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13


13 Les sorties cran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 25.1 Gestion de processus. . . Nouvelle Version !
14 Les entres clavier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 25.2 Gestion de processus : cration dun second processus
15 Les conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 26 Les fonctions : dfinition & arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
16 Quelques remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 27 Programmation Socket : protocole TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
17 Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 27.1 Programmation Socket : client TCP
17.1 Gestion des erreurs & Exceptions 27.2 Programmation Socket : serveur TCP
18 Les fichiers : cration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 27.3 Programmation Socket : TCP & gestion par ligne
18.1 Les fichiers : lecture par ligne 27.4 Programmation Socket : TCP & utilisation spciale
18.2 Les fichiers : lecture spciale et criture 27.5 Programmation Socket : lecture par ligne
18.3 Manipulation des donnes structures 27.6 Programmation Socket : mode non bloquant
19 Expressions rgulires ou expressions rationnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 27.7 Programmation socket : gestion par vnement
19.1 Expressions rgulires en Python 27.8 Programmation socket : le select
19.2 ER Complments : gestion du motif 27.9 Programmation socket : le protocole UDP
19.3 ER Complments : clatement et recomposition 28 Multithreading Threads . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
20 Gnration de valeurs alatoires : le module random . . . . . . . . . . . . . . . . . . . . . . . . . 11 28.1 Multithreading Smaphores
21 Les options en ligne de commande : le module optparse . . . . . . . . . . . . . . . . . . . . . 11 29 Manipulations avances : systme de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
22 Dbogage : utilisation du mode interactif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 29.1 Manipulations avances : UDP & Broadcast, Scapy
22.1 Dbogage avec le module pdb , Python Debugger 29.2 Manipulation avances : lcriture de Script systme
22.2 Surveiller lexcution, la journalisation : le module logging 29.3 Manipulations avances : construction de listes
23 Les objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 30 Pour amliorer lexprience de Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
24 Le contrle derreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 1


1 Pourquoi Python ? 1.1 Pourquoi Python ? Ses caractristiques
Il est : Il est :
? portable, disponible sous toutes les plate-formes (de Unix Windows) ; ? dynamique : il nest pas ncessaire de dclarer le type dune variable dans le source. Le type
est associ lors de lexcution du programme ;
? simple, avec une syntaxe claire, privilgiant la lisibilit, libre de celle de C/C++ ; ? fortement typ : les types sont toujours appliqus (un entier ne peut tre considr comme
une chane sans conversion explicite, une variable possde un type lors de son affectation).
? riche. Il incorpore de nombreuses possibilits de langage ? compil/interprt la manire de Java. Le source est compil en bytecode (pouvant tre
 tir de la programmation imprative : structure de contrle, manipulation de nombres sauvegard) puis excut sur une machine virtuelle.
comme les flottants, doubles, complexe, de structures complexes comme les tableaux, les
Il dispose dune gestion automatique de la mmoire ("garbage collector").
dictionnaires, etc.
 tir des langages de script : accs au systme, manipulation de processus, de larbores-
Il dispose de nombreuses bibliothques : interface graphique (TkInter), dveloppement Web
cence fichier, dexpressions rationnelles, etc.
(le serveur dapplication ZOPE, gestion de document avec Plone par exemple), inter-oprabilit
 tir de la programmation fonctionnelle : les fonctions sont dites fonction de premire
avec des BDs, des middlewares ou intergiciels objets( SOAP/COM/CORBA/.NET), danalyse
classe , car elles peuvent tre fournies comme argument dune autre fonction, il dispose
rseau (SCAPY), manipulation dXML, etc.
aussi de lambda expression, de gnrateur etc.
Il existe mme des compilateurs vers C, CPython, vers la machine virtuelle Java (Jython), vers
 tir de la programmation orient objet : dfinition de classe, hritage multiple, in-
.NET (IronPython) !
trospection (consultation du type, des mthodes proposes), ajout/retrait dynamique de
classes, de mthode, compilation dynamique de code, dlgation ("duck typing"), passi-
Il est utilis comme langage de script dans PaintShopPro, Blender3d, Autocad, Labview, etc.
vation/activation, surcharge doprateurs, etc.

1.2 Pourquoi Python ? Ses usages 2 Un programme Python


. Il permet de faire du prototypage dapplications. Mode interactif
. Cest un langage agile , adapt leXtreme programming : Sur tout Unix, Python est intgr et disponible.
Personnes et interaction plutt que processus et outils Sous la ligne de commande (shell), il suffit de lancer la commande python pour passer en mode
Logiciel fonctionnel plutt que documentation complte interactif : on peut entrer du code et en demander lexcution, utiliser les fonctions intgres (buil-
Collaboration avec le client plutt que ngociation de contrat tins), charger des bibliothques etc
Ragir au changement plutt que suivre un plan
pef@darkstar:~$ python
Intgrer de nombreux mcanismes de contrle derreur (exception, assertion), de test (pour viter les rgres- Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
sions, valider le code, ...). [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
. Et il permet de faire de la programmation rseaux !
>>> 10+20
30
Dans le cadre du module Rseaux avancs I >>> _
30
Les lments combins que sont : la gestion des expressions rationnelles, la programmation >>> _*2
socket et lutilisation de certaines classes dobjets nous permettrons de faire efficacement et 60
>>> help()
rapidement des applications rseaux conforme diffrents protocoles de communication.
La variable _ mmorise automatiquement le rsultat prcdent.
Remarques
La programmation objet ne sera pas obligatoire. Documentation
De mme que lutilisation de bibliothques pour rsoudre les problmes de TPs est for- Sous ce mode interactif, il est possible dobtenir de la documentation en appelant la fonction
mellement dconseille ! help(), puis en entrant lidentifiant de la fonction ou de la mthode.
La documentation complte du langage est disponible sur le rseau http://docs.python.org/.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 2


Un programme Python 3 Structure dun source Python
Les instructions
criture de code et excution
Les commentaires vont du caractre # jusqu la fin de la ligne.
Lextension par dfaut dun source Python est .py .
Il nexiste pas de commentaire en bloc comme en C (/* ... */).
Pour excuter un source python (compilation et excution sont simultanes), il existe deux m-
Chaque instruction scrit sur un ligne, il ny a pas de sparateur dinstruction. Si une ligne est
thodes :
trop grande, le caractre \permet de passer la ligne suivante.
1. en appelant linterprte Python de lextrieur du programme :
$ python mon_source.py Les blocs dinstructions
2. en appelant linterprte Python de lintrieur du programme : Les blocs dinstruction sont matrialiss par des indentations (plus de { et } !).
 on rend le source excutable, comme un script : 1 #!/usr/bin/python
$ chmod +x mon_source.py 2 # coding= latin1
 on met en premire ligne du source la ligne : 3 # les modules utilises
1 #!/usr/bin/python 4 import sys, socket
 on lance directement le programme : 5 # le source utilisateur
6 if (a == 1) :
$ ./mon_source.py
7 # sous bloc
Le ./ indique au systme de rechercher le script dans le rpertoire courant. 8 # indente (1 ou 4 espaces)
Le caractre : sert introduire les blocs.
La syntaxe est allge, facile lire et agrable (si si !).
La ligne 2, # coding= latin1, permet dutiliser des accents dans le source Python.

4 Les variables 5 Les valeurs et types de base


Une variable doit exister avant dtre rfrence dans le programme Il faut linstancier avant de sen servir, Il existe des valeurs prdfinies : True valeur boolenne vraie
sinon il y aura une erreur (une exception sera leve comme nous le verrons plus loin).
1 print a # provoque une erreur car a nexiste pas
False valeur boolenne vide
1 a = bonjour None objet vide retourn par certaines mthodes/fonctions
2 print a # fonctionne car a est dfinie
La variable est une rfrence vers une entit du langage Python interprte tout ce qui nest pas faux vrai.
1 a = entite chaine de caracteres Est considr comme faux :
2 b = a
0 ou 0.0 la valeur 0
les variables a et b font rfrences la mme chane de caractres. chane vide
Une variable ne rfrenant rien, a pour valeur None. "" chane vide
Il nexiste pas de constante en Python (pour signifier une constante, on utilise un nom tout en majuscule). () liste non modifiable ou tuple vide
Choix du nom des variables
[] liste vide
? Python est sensible la casse, il fait la diffrence entre minuscules et majuscules. {} dictionnaire vide
? Les noms des variables doivent tre diffrents des mots rservs du langage.
Les mots rservs Less is more !
and del for is raise Et les pointeurs ?
assert elif from lambda return Il nexiste pas de pointeur en Python : tous les lments tant manipuls par rfrence, il ny a donc
break else global not try pas besoin de pointeurs explicites !
class except if or while  Quand deux variables rfrencent la mme donne, on parle dalias .
continue exec import pass  On peut obtenir ladresse dune donne (par exemple pour comparaison) avec la fonction id().
def finally in print

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 3


6 Les structures de contrle Instructions & Conditions 6.1 Les structures de contrle Itrations
Les squences dinstructions Les itrations
Une ligne contient une seule instruction. Mais il est possible de mettre plusieurs instructions La boucle while dpend dune condition.
1 while <test>:
sur une mme ligne en les sparant par des ; (syntaxe dconseille).
2 <instructions1>
1 a = 1; b = 2; c = a*b
3 else :
4 <instructions2>
Les conditions
Faire toujours attention aux tabulations ! Les ruptures de contrle
1 if <test1> :
continue continue directement la prochaine itration de la
2 <instructions1>
boucle
3 elif <test2>:
break sort de la boucle courante (la plus imbrique)
4 <instructions2>
5 else: pass instruction vide (ne rien faire)
6 <instructions3> Le else de la structure de contrle nest excut que si la boucle na pas t interrompue par un
break.
Boucle infinie
Lorsquune seule instruction compose la condition, il est possible de lcrire en une seule ligne :
1 if a > 3: b = 3 * a Il est souvent pratique dutiliser une boucle while infinie (dont la condition est toujours vraie), et
dutiliser les ruptures de squences.
1 while 1:
2 if <condition> : break

7 Les oprateurs 8 La gestion des caractres


Logique Binaires (bit bit) Il nexiste pas de type caractre mais seulement des chanes contenant un caractre unique.
or OU logique | OU bits bits Une chane est dlimite par des ou des " ce qui permet den utiliser dans une chane :
and ET logique ^ OU exclusif 1 le_caractere = c
not ngation logique & ET 2 a = "une chaine avec des quotes" # ou une chaine avec des "doubles quotes"
dcalage gauche
3 print len(a) # retourne 28
dcalage droite
Comparaison La fonction len() permet dobtenir la longueur dune chane. Il est possible dcrire une chane
contenant plusieurs lignes sans utiliser le caractre \n, en lentourant de 3 guillemets :
<,>,<=,>=,==,!= infrieur, sup., infrieur ou gale, sup. ou gale, gale, diffrent
1 texte =""" premiere ligne
is, is not comparaison didentit (mme objet en mmoire)
1 c1= toto 2 deuxieme ligne"""
2 c2 = toto Pour pouvoir utiliser le caractre dchappement dans une chane il faut la faire prcder de r
3 print c1 is c2, c1 == c2 # teste lidentit et teste le contenu (pour raw) :
1 une_chaine = rpour passer la ligne il faut utiliser \n dans une chaine
Arithmtique En particulier, ce sera important lors de lentre dexpressions rgulires.
+, -, *, /,//,% addition, soustraction, multiplication, division, division entire, modulo
+=,-=,... opration + affectation de la valeur modifie Concatnation
Python v3 Il est possible de concatner deux chaines de caractres avec loprateur + :
Loprateur <> est remplac dfinitivement par !=. 1 a = "ma chaine"+" complete"
Loprateur / retourne toujours un flottant, et // est utilis pour la division entire.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 4


9 Les chanes de caractres 10 Les listes
Il est possible dinsrer le contenu dune variable dans une chane de caractres laide du %. Ces listes peuvent contenir nimporte quel type de donnes.
1 a = 120 Il existe deux types de listes :
2 b = La valeur est %d % a # b contient la chane La valeur est 120
1. celles qui ne peuvent tre modifies, appeles tuples ;
2. les autres, qui sont modifiables, appeles simplement liste !
Les caractres de formatage sont :
Les tuples
%s chane de caractres, en fait rcupre le rsultat de la commande str()
%f valeur flottante, par ex. %.2f pour indiquer 2 chiffres aprs la virgule Il sont nots sous forme dlments entre parenthses spars par des virgules.
1 a = (un, 2, trois)
%d un entier
Une liste dun seul lment correspond llment lui-mme
%x entier sous forme hexadcimal
La fonction len() renvoie le nombre dlments de la liste.

Les chanes sont des objets un objet offre des mthodes Les listes modifiables
Les chanes proposent diffrentes mthodes : Elles sont notes sous forme dlments entre crochets spars par des virgules.
rstrip supprime les caractres en fin de chane (par ex. le retour la ligne) Elles correspondent des objets contrairement aux tuples.
Exemple : chaine.rstrip(\n ) 1 a = [10, trois, 40]
upper passe en majuscule Les mthodes sont :
Exemple : chaine.upper() append(e) ajoute un lment e pop() enlve le dernier lment
splitlines dcompose une chane suivant les lignes et retourne une liste de lignes , sous pop(i) retire le i me lment extend concatne deux listes
forme dune liste de chane de caractres. sort trie les lments reverse inverse lordre des lments
etc. index(e) retourne la position de llment e

10.1 Les listes Exemples dutilisation 10.2 Les listes Utilisation comme pile et file
1 a = [1, deux, 3] Pour une approche algorithmique de la programmation, il est intressant de pouvoir disposer
2 a.append(quatre) des structures particulires que sont les piles et files.
3 print a La pile
[1, deux, 3, quatre] empiler ma_pile.append(element) >>> ma_pile = []
>>> ma_pile.append(sommet)
4 element = a.pop() dpiler element = ma_pile.pop() >>> ma_pile
5 print element, a [sommet]
>>> element = ma_pile.pop()
quatre [1, deux, 3]
>>> element
6 a.sort() sommet
7 print a
La file
[1, 3, deux]
enfiler ma_file.append(element) >>> ma_file = []
8 a.reverse() >>> ma_file.append(premier)
9 print a defiler element = ma_file.pop(0) >>> ma_file.append(second)
>>> element = ma_file.pop(0)
[deux, 3, 1] >>> element
premier
10 print a.pop(0)
deux Attention
Si element est une liste, alors il ne faut pas utiliser la mthode append mais extend.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 5


10.3 Utilisation spciale des listes 10.4 Laccs aux lments dune liste ou dun tuple
Affectation multiples Il est possible de parcourir les lments dune liste laide de for :
1 for un_element in une_liste:
Il est possible daffecter une liste de variables, une liste de valeurs :
2 print un_element
1 (a, b, c) = (10, 20, 30)
Il est possible de les considrer comme des vecteurs :
2 print a, b, c ? on peut y accder laide dun indice positif partir de zro ou bien ngatif (pour partir de la fin)
Les parenthses ne sont pas ncessaires sil ny a pas dambigut. 1 ma_liste[0] # le premier element
1 a, b, c = 10, 20, 30 2 ma_liste[-2] # lavant dernier element
2 print a, b, c Il est possible dextraire une sous-liste :
? une tranche qui permet de rcuprer une sous-liste
10 20 30
1 ma_liste[1:4] # du deuxieme element au 4ieme element
En particulier, se sera utile pour les fonctions retournant plusieurs valeurs. 2 # ou de lindice 1 au 4 (4 non compris)
3 ma_liste[3:] # de lindice 3 la fin de la liste
Oprateur dappartenance Il est possible de crer une liste contenant des entiers dun intervalle :
1 l = range(1,4) # de 1 4 non compris
Loprateur in permet de savoir si un lment est prsent dans une liste. 2 m = range(0,10,2) # de 0 10 non compris par pas de 2
1 a in [a, b, c] 3 print l,m
True [1, 2, 3] [0, 2, 4, 6, 8]
Do le fameux accs indic, commun au C, C++ ou Java :
1 for valeur in range(0,5) :
2 print vecteur[valeur]

10.5 Des listes comme tableau 2 dimensions 10.6 Un accs par indice aux lments dune chane
Il nexiste pas de tableau deux dimensions en Python comme dans dautres langages de pro- Et le rapport entre une liste et une chane de caractres ?
grammation. Elles bnficient de laccs par indice, par tranche et du parcours avec for :
Un tableau une dimension correspond une liste. 1 a = une_chaine
Un tableau deux dimensions correspond une liste de liste. 2 b = a[4:7] # b reoit cha
Cration et utilisation du tableau deux dimensions Pour pouvoir modifier une chane de caractre, il nest pas possible dutiliser laccs par indice :
1 nb_lignes = 5  La fonction xrange() fonctionne comme 1 a = le voiture
2 nb_colonnes = 4 la fonction range() mais elle est plus ef- 2 a[1] = a
3 tableau2D = [] ficace dans ce contexte dutilisation. Traceback (most recent call last):
4 for i in xrange(0, nb_lignes): File "<stdin>", line 1, in <module>
5 tableau2D.append([])  Laccs aux diffrentes cases du tableau TypeError: str object does not support item assignment
6 for j in xrange(0, nb_colonnes): se fait suivant chaque dimension partir
Il faut dabord convertir la chane de caractres en liste, avec la fonction list() :
7 tableau2D[i].append(0) de la position 0, suivant la notation :
1 a = list(le voiture)
8 tableau2D[2][3] = a tableau2D[ligne][colonne]
2 a[1] = a
9 tableau2D[4][3] = b
Puis, recomposer la chane partir de la liste de ses caractres :
10 print tableau2D
1 b = .join(a)
Ce qui donne : 2 print b
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, a], [0, 0, 0, 0], [0, 0, 0, b]]
la voiture
Il est possible de gnraliser des tableaux de dimensions suprieures.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 6


11 Les dictionnaires 12 Les modules et lespace de nom
Ces objets permettent de conserver lassociation entre une cl et une valeur. Un module regroupe un ensemble cohrent de fonctions, classes objets, variables globales (pour
Ce sont des tables de hachage pour un accs rapide aux donnes : dfinir par exemple des constantes).
 La cl et la valeur peuvent tre de nimporte quel type non modifiable. Chaque module est nomm. Ce nom dfinit un espace de nom.
 La fonction len() retourne le nombre dassociations du dictionnaire.
En effet, pour viter des collisions dans le choix des noms utiliss dans un module avec ceux
Liste des oprations du dictionnaire
des autres modules, on utilise un accs prfix par le nom du module :
Initialisation dico = {} 1 nom_module.element_defini_dans_le_module
dfinition dico = {un: 1, deux : 2} Il existe de nombreux modules pour Python capable de lui donner des possibilits trs tendues.
accs b = dico[un] # recupere 1
interrogation if dico.has_key(trois) : Accs un module dans un autre
if trois in dict: Il se fait grce la commande import.
ajout ou modification dico[un] = 1.0 1 import os # pour accder aux appels systmes
2 import sys # pour la gestion du processus
suppression del dico[deux]
3 import socket # pour la programmation socket
rcupre la liste des cls les_cles = dico.keys()
rcupre la liste des valeurs les_valeurs = dico.values() 5 os.exit() # terminaison du processus
Afficher le contenu dun dictionnaire 6 socket.SOCK_STREAM # une constante pour la programmation rseaux

1 for cle in mon_dico.keys():


2 print "Association ", cle, " avec ", mon_dico[cle]

13 Les sorties cran 14 Les entres clavier


La fonction print permet dafficher de manire gnrique tout lment, que ce soit un objet, La fonction input() permet de saisir au clavier des valeurs.
une chane de caractres, une valeur numrique etc. Cette fonction retourne les donnes saisies comme si elles avaient t entres dans le source Python.
Par dfaut, elle ajoute un retour la ligne aprs. En fait, input() permet dutiliser linterprte ou parser Python dans un programme (combin la
fonction eval(), elle permet de rentrer et dvaluer du code dans un programme qui sexcute !).
Le passage dune liste permet de coller les affichages sur la mme ligne.
1 a = input() # ici on entre [10,bonjour,30]
1 a = bonjour
2 print a
2 c = 12
On obtient :
3 d = open(fichier.txt)
[10, bonjour, 30]
4 print a
5 print c,d, La valeur est %d % c Une exception est leve si les donnes entres ne sont pas correctes en Python.
On obtient :
Ce que nous utiliserons
bonjour
12 <open file fichier.txt, mode r at 0x63c20> La valeur est 12 Pour saisir des donnes en tant que chane de caractres uniquement, il faut utiliser la fonction
Print affiche le contenu affichable de lobjet.
raw_input() qui retourne un chane de caractres, que lon convertira au besoin.
1 saisie = raw_input("Entrer ce que vous voulez") # retourne toujours une chane

Il est galement possible dutiliser stdout ou stderr : Python v3


1 import sys
La fonction input() effectue le travail de la fonction raw_input() qui disparait.
2 sys.stdout.write(Hello\n)

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 7


15 Les conversions Autres conversions
Vers la notation hexadcimale
Il existe un certain nombre de fonctions permettant de convertir les donnes dun type lautre.
un caractre donn sous sa notation hexadcimale dans une chane :
La fonction type() permet de rcuprer le type de la donne sous forme dune chane.
>>> a = \x20
fonction description exemple >>> ord(a)
32
ord retourne la valeur ASCII dun caractre ord(A) avec le module binascii, on obtient la reprsentation hexa de chaque caractre :
chr retourne le caractre partir de sa valeur char(65)
>>> import binascii
ASCII >>> binascii.hexlify(ABC123...\x01\x02\x03)
str convertit en chane str(10), str([10,20]) 4142433132332e2e2e010203
int interprte la chane en entier int(45) avec la mthode encode et dcode dune chane de caractres :
long interprte la chane en entier long long(56857657695476) >>> s=ABCD1234
float interprte la chane en flottant float(23.56) >>> s.encode("hex")
4142434431323334
Conversion binaire >>> 4142434431323334.decode(hex)
ABCD1234
Il est par exemple possible de convertir un nombre exprim en format binaire dans une chane
de caractres : Il est possible de revenir la valeur dcimale code par ces valeurs :
>>> int(s.encode(hex),16)
1 representation_binaire = bin(204) # partir de Python v2.6, donne 0b11001100
4702394921090429748
2 entier = int(11001100,2) # on donne la base, ici 2, on obtient la valeur 204
>>> bin(int(s.encode(hex),16))
3 entier = int(0b11001100,2) # donne le mme rsultat 0b100000101000010010000110100010000110001001100100011001100110100
Le prfixe 0b nest pas obligatoire et peut tre supprim. Attention de bien faire la distinction entre ces diffrentes notations !

16 Quelques remarques 17 Gestion des erreurs


Python utilise le mcanisme des exceptions : lorsquune opration ne se droule pas correc-
INTERDIT : Oprateur daffectation
tement, une exception est leve ce qui interrompt le contexte dexcution, pour revenir un
Loprateur daffectation na pas de valeur de retour. environnement dexcution suprieur, jusqu celui grant cette exception.
Il est interdit de faire : Par dfaut, lenvironnement suprieur est le shell de commande depuis lequel linterprte Py-
1 if (a = ma_fonction()): thon a t lanc, et le comportement de gestion par dfaut est dafficher lexception :
2 # oprations
Traceback (most recent call last):
File "test.py", line 1, in ?
INTERDIT : Oprateur dincrmentation 3/0
ZeroDivisionError: integer division or modulo by zero
Loprateur ++ nexiste pas, mais il est possible de faire :
1 a += 1 Pour grer lexception, et viter la fin du programme, il faut utiliser la structure try et except :
1 try:
2 #travail susceptible dchouer
Pour convertir un caractre en sa reprsentation binaire sur 8 bits 3 except:
Linstruction bin() retourne une chane sans les bits de gauche gaux zro. 4 #travail faire en cas dchec
Exemple : bin(5) = 0b101
1 representation_binaire = bin(ord(caractere))[2:] # en supprimant le 0b du dbut
La squence binaire retourne commence au premier bit 1 en partant de la gauche.
Pour obtenir une reprsentation binaire sur 8bits, il faut la prfixer avec des 0 :
1 rep_binaire = 0*(8-len(representation_binaire))+representation_binaire

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 8


17.1 Gestion des erreurs & Exceptions 18 Les fichiers : cration
Il est possible de gnrer des exceptions laide de la commande raise. Ouverture, cration et ajout
Ces exceptions correspondent des classes objet hritant de la classe racine Exception. La fonction "open" renvoie un objet de type file et sert ouvrir les fichiers en :
1 raise NameError(Oups une erreur !) #NameError indique que le nom nexiste pas "r" lecture
Il existe de nombreux types dexception (diffrentes classes hritant de Exception).
Elles peuvent galement transmettre des paramtres. "w" criture le fichier est cr sil nexiste pas, sinon il est cras
1 nombre = raw_input( "Entrer valeur: " ) "a" ajout le fichier est cr sil nexiste pas, sinon il est ouvert et lcriture se fait la fin
2 try:
3 nombre = float( nombre ) Pour vrifier que louverture du fichier se fait correctement, il faut traiter une exception de
4 resultat = 20.0 / nombre type Exception (elle peut fournir une description de lerreur).
5 except ValueError: 1 try:
6 print "Vous devez entrer un nombre" 2 fichier = open("lecture_fichier.txt","r")
7 except ZeroDivisionError: 3 except Exception, message:
8 print "Essai de division par zro" 4 print message
9 print "%.3f / %.3f = %.3f" % ( 20.0, nombre, resultat ) Ce qui peut produire :
Question : est-ce que toutes les exceptions sont gres dans cette exemple ? [Errno 2] No such file or directory: lecture_fichier.txt
Pour simplifier, on utilisera le type de la classe racine Exception, car on attend ici quune seule erreur.
La dfinition de ses propres exceptions est en dehors du domaine dapplication de ce cours.
Dans le cas o lon veut grer plusieurs exceptions de types diffrents, il faut indiquer leur type respectif.

18.1 Les fichiers : lecture par ligne 18.2 Les fichiers : lecture spciale et criture
Lecture dun fichier Lecture caractre par caractre
Sans argument, la mthode readline renvoie la prochaine ligne du fichier.
Lobjet de type file peut tre utilis de diffrentes manires pour effectuer la lecture dun
Avec largument n, cette mthode renvoie n caractres au plus (jusqu la fin de la ligne).
fichier. Cest un objet qui peut se comporter comme une liste, ce qui permet dutiliser le for :
Pour lire exactement n caractres, il faut utiliser la mthode read.
1 for une_ligne in fichier: Avec un argument de 1, on peut lire un fichier caractre par caractre.
2 print une_ligne la fin du fichier, elle renvoie une chane vide (pas dexception).
1 while 1:
Mais galement comme un itrateur (qui lve une exception la fin) : 2 caractere = fichier.read(1)
1 while 1: 3 if not caractere : break
4 fichier.close() # ne pas oublier de fermer le fichier
2 try:
3 une_ligne = fichier.next() #renvoie lexception StopIteration en cas dchec criture dans un fichier
4 print une_ligne 1 fichier = open("lecture_fichier.txt","a") # ouverture en ajout
5 except: break 2 fichier.write(Ceci est une ligne ajoutee en fin de fichier\n)
3 fichier.close()
Autres mthodes
Ou bien simplement travers la mthode readline() :
1 while 1: read(n) lit n caractres quelconques (mme les \n) dans le fichier
fileno() retourne le descripteur de fichier numrique
2 une_ligne = fichier.readline() #renvoie une ligne avec le \n la fin
readlines() lit et renvoie toutes les lignes du fichier
3 if not une_ligne: break
tell() renvoie la position courante, en octets depuis le dbut du fichier
4 print une_ligne seek(dc,rf) positionne la position courante en dcalage par rapport la rfrence indique par 0 :
dbut, 1 : relative, 2 : fin du fichier

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 9


18.3 Manipulation des donnes structures Manipulation de donnes structures : formats
Les donnes structures correspondent une squence doctets. Cette squence est compose La chane de format
de groupes doctets correspondant chacun un type. En C ou C++ : Elle est compose dune suite de caractres spciaux :
1 struct exemple { type C Python type C Python
2 int un_entier; # 4 octets
x pad byte pas de valeur
3 float un_flottant[2]; # 2*4 = 8 octets
c char chane de 1 car. s string char[ ]
4 char une_chaine[5]; # 5 octets
b signed char integer B unsigned char integer
5 } # la structure complte fait 17 octets
h short integer H unsigned short integer
En Python, les structures de cette forme nexistent pas et une chane de caractre sert mani- i int integer I unsigned int long
puler cette squence doctets. l long integer L unsigned long long
Le module spcialis struct permet de dcomposer ou composer cette squence doctets sui- f float float d double float
vant les types contenus. Exemple : un entier sur 32bits correspond une chane de 4 caractres. Un ! devant le caractre permet linterprtation dans le sens rseau (Big-Endian).
Pour dcrire la structure, on utilise une chane de format o des caractres spciaux expriment Pour rpter un caractre il suffit de le faire prcder du nombre doccurrences (obligatoire pour
les diffrents types. le s o il indique le nombre de caractres de la chane).
Le module fournit 3 fonctions : Il faut mettre un = devant le format pour garantir lalignement des donnes.
calcsize(chaine_fmt) retourne la taille de la squence complte
pack(chaine_fmt,...) construit la squence partir de la chane de format et Sur lexemple prcdent, la chane de format est : iffccccc ou i2f5c.
dune liste de valeurs 1 import struct
unpack(chaine_fmt,c) retourne une liste de valeurs en dcomposant suivant la 2 donnees_compactes = struct.pack(=iffccccc, 10, 45.67, 98.3, a, b, c, d, e)
chane de format 3 liste_valeurs = struct.unpack(=i2f5c, donnees_compactes)

19 Expressions rgulires ou expressions rationnelles 19.1 Expressions rgulires en Python


Une ER permet de faire de lappariement de motif, pattern matching : il est possible de savoir si un motif Le module re permet la gestion des expressions rgulires :
est prsent dans une chane, mais galement comment il est prsent dans la chaine (en mmorisant la ? la composition de lexpression, avec des caractres spciaux (comme \d pour digit) ;
squence correspondante). ? la compilation, pour rendre rapide le traitement ;
? la recherche dans une chane de caractres ;
Une expression rgulire est exprime par une suite de meta-caractres, exprimant :
? la rcupration des squences de caractres correspondantes dans la chane.
. une position pour le motif . une alternative
1 import re
^ : dbut de chane | : ceci ou cela, exemple : a|b
$ : fin de chane 2 une_chaine = 12 est un nombre
. un caractre 3 re_nombre = re.compile(r"(\d+)") # on exprime, on compile lexpression rgulire
. : nimporte quel caractre 4 resultat = re_nombre.search(une_chaine) #renvoie lobjet None en cas dchec
[ ] : un caractre au choix parmi une liste, exemple : [ABC] 5 if resultat :
[^ ] : tous les caractres sauf..., exemple : [^@] tout sauf le @ 6 print trouv !
[a-zA-Z] : toutes les lettres minuscules et majuscules 7 print resultat
8 print resultat.group(1)
. des quantificateurs, qui permettent de rpter le caractre qui les prcdent :
* : zro, une ou plusieurs fois trouv !
+ : une ou plusieurs fois { n } : n fois <_sre.SRE_Match object at 0x63de0>
? : zro ou une fois { n, m } : entre n et m fois 12
. des familles de caractres : Lajout de parenthses dans lER permet de mmoriser une partie du motif trouv, accessible
\d : un chiffre \D : tout sauf un chiffre \n newline comme un groupe indic de caractres (mthode group(indice)).
\s : un espace \w : un caractre alphanumrique \r retour-chariot

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 10


19.2 ER Complments : gestion du motif 19.3 ER Complments : clatement et recomposition
Diffrence majuscule/minuscule Dcomposer une ligne
Pour ne pas en tenir compte, il faut lindiquer avec une constante de module. Il est possible "dclater" une ligne suivant lER reprsentant les sparateurs :
1 re_mon_expression = re.compile(r"Valeur\s*=\s*(\d+)", re.I) 1 import re
Ici, re.I est labrviation de re.IGNORECASE. 2 chaine = Arthur:/::Bob:Alice/Oscar
3 re_separateur = re.compile( r"[:/]+" )
Motifs memoriss
4 liste = re_separateur.split(chaine)
Il est possible de rcuprer la liste des motifs mmoriss : 5 print liste
1 import re
[Arthur, Bob, Alice, Oscar]
2 chaine = Les valeurs sont 10, 56 et enfin 38.
3 re_mon_expression = re.compile(r"\D*(\d+)\D*(\d+)\D*(\d+)", re.I)
4 resultat = re_mon_expression.search(chaine) Composer une ligne
5 if resultat : Il est possible de composer une ligne en joignant les lments dune liste laide de la
6 liste = resultat.groups() mthode join dune chane de caractre :
7 for une_valeur in liste: 1 liste = [Mon, chat,"sappelle",Neko]
8 print une_valeur 2 print liste
On obtient : 3 print "_".join(liste)
10 [Mon, chat, "sappelle", Neko]
56 Mon_chat_sappelle_Neko
38
Ici, la chane contient le sparateur qui sera ajout entre chaque lment.

20 Gnration de valeurs alatoires : le module random 21 Les options en ligne de commande : le module optparse
Choix dune valeur numrique dans un intervalle Le module optparse permet de :
dfinir les options du programme et leur documentation ainsi que leur traitement :
1 #!/usr/bin/python  chaque option possde une version courte ou longue, plus explicite ou verbose :
2 # coding= utf8 $ ./ma_commande.py -l mon_fichier.txt
3 import random $ ./ma_commande.py -lire-fichier=mon_fichier.txt
 lors de la demande daide avec -h , chaque option dispose dune description :
5 random.seed() # initializer le gnrateur alatoire $ ./ma_commande.py -h
6 # Pour choisir alatoirement une valeur entre 1 et 2^32 Usage: ma_commande.py [options]

7 isn = random.randrange(1, 2**32) # on peut aussi utiliser random.randint(1,2**32) Options:


8 print isn -h, -help show this help message and exit
-l NOM_FICHIER, -lire-fichier=NOM_FICHIER
2769369623 lit un fichier
-c, -convertir convertit le fichier
Choix alatoire dune valeur depuis un ensemble de valeurs  une option peut tre associe :
1 # retourne une valeur parmi celles donnes dans la chane ? la valeur qui la suit :
$ ./ma_commande.py -l mon_fichier.txt
2 caractere = random.choice(ABC123)
3 print caractere ? un boolen :
$ ./ma_commande.py -c
B
 les options peuvent tre combines :
$ ./ma_commande.py -l mon_fichier.txt -c

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 11


Les options en ligne de commande : le module optparse 22 Dbogage : utilisation du mode interactif
Le module optparse permet de : Le mode interactif pour dialoguer avec le programme
dcomposer les options passes au programme sur la ligne de commande :
1 #!/usr/bin/python On peut dclencher lexcution dun programme Python, puis basculer en mode interactif dans
2 import optparse le contexte de ce programme, avec loption -i :
3 parseur = optparse.OptionParser() # cre un parseur que lon configure ensuite $ python -i mon_programme.py
4 parseur.add_option(-l, -lire-fichier, help=lit un fichier,dest=nom_fichier)
5 parseur.add_option(-c, -convertir, help=convertit le fichier,dest=conversion, Sur le programme de gnration de valeurs alatoires :
6 default=False,action=store_true) # store_true stocke True si loption est prsente pef@darkstar:~$ python -i test.py
7 (options, args) = parseur.parse_args() # args sert pour des options multiples valeurs
184863612
8 dico_options = vars(options) # fournit un dictionnaire doptions
>>> isn
9 print dico_options # affiche simplement le dictionnaire
184863612
Les fonctions :
. optparse.OptionParser() sert crer un parseur pour lanalyse des options ; >>>
. parseur.add_option sert ajouter une option : On peut galement passer en mode interactif depuis le programme lui-mme :
 largument dest permet dassocier une cl la valeur dans le dictionnaire rsultat ;
1 #!/usr/bin/python
 largument default dfinit une valeur par dfaut que loption soit ou non prsente ;
 largument action dfinit une opration raliser avec loption prsente : 2 import code
? si rien nest prcis, la valeur de loption est stocke sous forme de chane ; 3 ...
? si on prcise store_true on associe la valeur True en cas de prsence de loption. 4 # on bascule en mode interactif
lexcution : 5 code.interact(local=locals())

$ ./ma_commande.py -l mon_fichier.txt -c Il est alors possible de consulter la valeur des variables ou dappeler des fonctions etc.
{conversion: True, nom_fichier: mon_fichier.txt}

22.1 Dbogage avec le module pdb , Python Debugger 22.2 Surveiller lexcution, la journalisation : le module logging
On peut lancer un programme Python en activant le dbo- pef@darkstar:~$ python -m pdb tester_dbg.py Le jogging permet dorganiser les sorties de suivi et derreur dun programme :
gueur : > /home/pef/tester_dbg.py(3)<module>()
 plus efficace quun print : on peut rediriger les sorties vers un fichier ;
-> compteur = 0
$ python -m pdb mon_programme.py
(Pdb) next  plus facile dsactiver dans le cas o le debogage nest plus ncessaire ;
Les commandes sont les suivantes : > /home/pef/tester_dbg.py(4)<module>()  contrlable suivant un niveau plus ou moins dtaill :
n next passe linstruction suivante
-> for i in range(1,10):
logging.CRITICAL Lorsquun niveau est activ, automatiquement
(Pdb) n
logging.ERROR ceux de niveau infrieur sont galement activs :
l list affiche la liste des instructions > /home/pef/tester_dbg.py(5)<module>()
-> compteur += 1 logging.WARNING le niveau WARNING active galement ceux INFO
b break positionne un breakpoint (Pdb) n logging.INFO et DEBUG.
ex : break tester_dbg.py:6 > /home/pef/tester_dbg.py(4)<module>()
logging.DEBUG
-> for i in range(1,10):
c continue va jusquau prochain breakpoint (Pdb) i
Dans le cours nous nous limiterons au seul niveau DEBUG.
r return continue lexcution 1
(Pdb) n
 contrlable par une ligne dans le source :
jusquau retour de la fonction 1 #!/usr/bin/python
> /home/pef/tester_dbg.py(5)<module>()

Lors du dbogage, il est possible dafficher le contenu des -> compteur += 1 2 import logging
(Pdb) i
variables. 2 4 logging.basicConfig(level=logging.DEBUG)
(Pdb) l
5 ...
Il est galement possible dinsrer la ligne suivante dans un 1 #!/usr/bin/python
6 logging.debug(Ceci est un message de debogage)
programme un endroit particulier o on aimerait dclen- 2

cher le dbogage :
3 compteur = 0
$ python debogage.py Pour dsactiver le dbogage, il suffit de modifier
4 for i in range(1,10):
5 -> compteur += 1 DEBUG:root:Ceci est un message de debogage le programme en changeant la ligne 4 :
1 import pdb; pdb.set_trace() 4 logging.basicConfig()
6 print compteur
[EOF]
(Pdb)  possibilit de renvoyer les sorties de dbogage vers un fichier :
4 logging.basicConfig(level=logging.DEBUG, filename=debug.log)

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 12


Surveiller lexcution, la journalisation : le module logging 23 Les objets
 ajout de lheure et de la date courante chaque sortie : Il est possible de dfinir des classes dobjets.
4 logging.basicConfig(level=logging.DEBUG, filename=debug.log, Une classe peut tre dfinie tout moment dans un source, et on peut en dfinir plusieurs dans le mme
5 format=%(asctime)s %(levelname)s: %(message)s,
source (contrairement Java)
6 datefmt=%Y-%m-%d %H:%M:%S)
1 class ma_classe(object): #herite de la classe object
 activation par option du dbogage et choix de son stockage dans un fichier : 2 variable_classe = 10
1 #!/usr/bin/python 3 __init__(self):
2 import logging,optparse 4 self.variable_instance=10
5 def une_methode(self):
4 parser = optparse.OptionParser() 6 print self.variable_instance
5 parser.add_option(-l, -logging, dest=logging, default=False, action=store_true)
La fonction __init__() permet de dfinir les variables dinstance de lobjet.
6 parser.add_option(-f, -logging-file, dest=logging-file,help=Logging file name)
7 (options, args) = parser.parse_args()
Le mot cl self permet davoir accs lobjet lui-mme et ses attributs.
8 dico_options = vars(options) Les attributs sont des mthodes et des variables.
9 if dico_options[logging] : Les attributs dun objet peuvent varier au cours du programme (comme en Javascript).
10 logging.basicConfig(level=logging.DEBUG, filename=dico_options[logging-file], Il est possible de parcourir les attributs dun objet avec la fonction dir().
11 format=%(asctime)s %(levelname)s: %(message)s, 1 print dir([])
12 datefmt=%Y-%m-%d %H:%M:%S)
[__add__, __class__, __contains__, __delattr__, __delitem__,
13 logging.debug(Ceci est un message de debogage)
__delslice__, __doc__, __eq__, __ge__, __getattribute__,
lexcution :
__str__, append, count, extend, index, insert, pop, remove,
$ python debogage.py -l
2012-09-02 16:25:02 DEBUG: Ceci est un message de debogage
reverse, sort]

24 Le contrle derreur 25 Gestion de processus : lancer une commande


Une forme simple de programmation par contrat est introduite grce la fonction assert : Excuter une commande
1 assert un_test, une_chaine_de_description Il est possible de lancer une commande shell pour en obtenir le rsultat :
Si la condition nest pas vrifie alors le programme lve une exception. 1 import commands
1 try: 2 resultat_ls = commands.getoutput(ls *.py) # rcupre la liste des fichiers
2 a = 10
3 assert a<5, "mauvaise valeur pour a" Se connecter une commande
4 except AssertionError,m:
Il est possible de lancer une commande shell en multitche et :
5 print "Exception: ",m
de lui envoyer des lignes en entre (sur le stdin de la commande) ;
Exception: mauvaise valeur pour a de rcuprer des lignes en sortie (depuis le stdout).
Ainsi, il est possible dintgrer des tests pour tre sr des entres dune fonction par exemple et 1 import os
ce, afin de faire des programmables maintenables ! 2 sortie_commande = os.popen(ma_commande)
3 while 1:
4 line = sortie_commande.readline()
quivalent
2 sortie_commande = os.popen(ma_commande,r) # pour lire uniquement

Pour envoyer des lignes la commande :


2 entree_commande = os.popen(ma_commande,w) # pour crire uniquement

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 13


25.1 Gestion de processus. . . Nouvelle Version ! 25.2 Gestion de processus : cration dun second processus
Dans les dernires versions de Python, vous obtiendrez un avertissement dobsolescence De- Scinder le processus en deux
precationWarning lutilisation de os.popen. La commande fork permet de scinder le processus courant en deux avec la cration dun nou-
veau processus. Lun est dsign comme tant le pre et lautre, le fils.
La nouvelle faon de procder est la suivante, on utilise le module subprocess : 1 import os, sys
1 import subprocess 2 pid = os.fork()
2 mon_programme = subprocess.Popen([wc,-l], stdin=subprocess.PIPE, 3 if not pid :
3 stdout=subprocess.PIPE) 4 # je suis lenfant
4 mon_programme.stdin.write("Bonjour tout le monde") 5 else:
5 mon_programme.stdin.close() 6 # je suis le pre
6 print mon_programme.stdout.read() 7 os.kill(pid, 9) # terminaison du processus fils
. la ligne 2, on lance la commande, ici wc, avec largument -l, et on indique que lon veut
rcuprer les canaux stdin, pour lentre, et stdout, pour la sortie, de cette commande ; Gestion des arguments du processus
. la ligne 3 on envoie une ligne de texte la commande qui sexcute en multi-tche ;
Pour rcuprer la liste des arguments du script (nom du script compris) :
. la ligne 4, on ferme le fichier dentre ce qui indique la commande quelle ne recevra plus
1 import sys
dentre et donc quelle peut commencer travailler ;
2 print sys.argv
. en ligne 5, on rcupre le rsultat de son travail ;
. a marche ! [mon_script.py, -nom,toto]

26 Les fonctions : dfinition & arguments Les fonctions : valeur de retour & -fonction
La dfinition dune fonction se fait laide de def : Plusieurs valeurs de retour
1 def ma_fonction(): 1 def ma_fonction(x,y):
2 #instructions 2 return x*y,x+y
Les paramtres de la fonction peuvent tre nomms et recevoir des valeurs par dfaut. Ils peuvent 3 # code principal
ainsi tre donn dans le dsordre et/ou pas en totalit (trs utile pour les objets dinterface 4 produit, somme = ma_fonction(2,3)
comportant de nombreux paramtres dont seulement certains sont changer par rapport leur 5 liste = ma_fonction(5,6)
valeur par dfaut). 6 print produit, somme
1 def ma_fonction(nombre1 = 10, valeur = 2): 7 print liste
2 return nombre1 / valeur 6 5
3 print ma_fonction() (30,11)
4 print ma_fonction(valeur = 3)
5 print ma_fonction(27.0, 4)
Une lambda expression ou un objet fonction
5.0
3.33333333333 1 une_fonction = lambda x, y: x * y

6.75 2 print une_fonction(2,5)


10

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 14


27 Programmation Socket : protocole TCP 27.1 Programmation Socket : client TCP
Utilisation du protocole TCP Programmation dun client en TCP
Une connexion TCP correspond un tube contenant deux canaux, un pour chaque direction de 1 import os,socket,sys

communication (A vers B, et B vers A). 3 adresse_serveur = socket.gethostbyname(localhost) # realise une requte DNS
Les changes sont buffriss : les donnes sont stockes dans une mmoire tampon jusqu ce 4 numero_port = 6688
que le systme dexploitation les envoie dans un ou plusieurs datagrammes IP. 5 ma_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

7 try: ma_socket.connect((adresse_serveur, numero_port))


Les primitives de connexion pour le protocole TCP : socket, bind, listen, accept, 8 except Exception, description:
connect, close, shutdown. 9 print "Probleme de connexion", description
10 sys.exit(1)
shutdown(flag) ferme la connexion 11 while 1:
en lecture (SHUT_RD), en criture (SHUT_WR) 12 ligne = ma_socket.recv(1024) #reception dune ligne dau plus 1024 caracteres
en lecture et criture (SHUT_RDWR) 13 if not ligne: break
close() ferme la connexion dans les deux sens 14 else:
recv(max) reoit au plus max octets, mais peut en recevoir moins suivant le 15 print ligne
dbit de la communication (ATTENTION !) 16 ma_socket.close()

send(data) envoie data Attention


retourne le nombre doctets effectivement envoys
Le paramtre donn ma_socket.recv(1024) indique la taille maximale que lon voudrait
sendall(data) bloque jusqu lenvoi effectif de data recevoir, mais ne garantie pas quelle retournera forcment 1024 caractres.

27.2 Programmation Socket : serveur TCP


Programmation dun serveur en TCP
27.3 Programmation Socket : TCP & gestion par ligne
Les protocoles bass sur TCP utilisant le concept de ligne
??
1 import os,socket,sys Certains protocoles changent des donnes structures sous forme de lignes (spares par des
\r\n).
3 numero_port = 6688 Pour la rception
4 ma_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
donnees = ma_socket.recv(1024) peut retourner plus quune seule ligne.
5 ma_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
Exemple : A envoie B, 30 lignes de texte pour un total de 920 octets.
6 ma_socket.bind((, numero_port)) # quivalent INADDR_ANY
Lors du transfert dans le rseau ces 920 octets sont dcomposs en un paquet de 500 octets et
7 ma_socket.listen(socket.SOMAXCONN)
un autre de 420 octets.
8 while 1:
Lorsque B reoit les 500 octets alors il est probable quils ne contiennent pas un nombre entier
9 (nouvelle_connexion, TSAP_depuis) = ma_socket.accept()
de lignes (le dernier octet reu est situ au milieu dune ligne).
10 print "Nouvelle connexion depuis ", TSAP_depuis
Il est ncessaire de vrifier les donnes reues et ventuellement de les concatner aux suivantes
11 nouvelle_connexion.sendall(Bienvenu\n)
pour retrouver lensemble de lignes.
12 nouvelle_connexion.close()
Pour lenvoi
13 ma_socket.close()
nb_octets = ma_socket.send(data) peut ne pas envoyer toutes les octets.
Remarques
Il est ncessaire de vrifier que le systme dexploitation a bien transmis lintgralit des don-
Pour envoyer une ligne : nes avant de passer lenvoi des donnes suivantes.
1 nouvelle_connexion.sendall(Ceci est une ligne\n) Solution : utiliser linstruction sendall() au lieu de send().
Lenvoi se fait sans attendre que le buffer denvoi soit plein.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 15


27.4 Programmation Socket : TCP & utilisation spciale
Utilisation dune socket la manire dun fichier
?? 27.5 Programmation Socket : lecture par ligne
Lecture dune ligne de protocole
Une fois la socket cre, il est possible de la manipuler la manire dun fichier laide de On peut dfinir une fonction renvoyant une ligne spare par \r\n lue depuis la socket caractre par
linstruction makefile(). caractre :
1 def lecture_ligne(ma_socket):
1 mon_fichier_socket = ma_socket.makefile()
2 ligne=
2 while 1:
3 while 1:
3 ligne = mon_fichier_socket.readline()
4 caractere = ma_socket.recv(1)
4 if not ligne : break 5 if not caractere :
5 else: 6 break
6 print ligne 7 ligne += caractere
Il est galement possible de lire caractre par caractre les donnes. 8 if caractere == \r:
1 mon_fichier_socket = ma_socket.makefile() 9 caractere = ma_socket.recv(1)
2 while 1: 10 ligne += caractere
3 caractere = mon_fichier_socket.readline(1) 11 if caractere == \n:
12 break
Attention 13 ligne += caractere

La fermeture du fichier obtenu est indpendante de la socket. 14 return ligne

Autrement dit, il faut fermer les deux pour fermer la communication ! Attention
Ce sera cette version que vous utiliserez dans les TPs.

27.6 Programmation Socket : mode non bloquant 27.7 Programmation socket : gestion par vnement
Utilisation dune socket en mode non bloquant Le module select et sa fonction select() permet dtre averti de larrive dvnements
Une fois la socket cre, il est possible de ne plus tre bloqu en lecture lorsquil ny a pas de sur des descripteurs de fichier ou des sockets.
donnes disponibles sur la socket. Ainsi, il est possible de ne plus se bloquer en lecture, voire en criture, sur tel ou tel descripteur
1 ma_socket.setblocking(0) ou socket.
2 while 1: Ces vnements sont :
3 try : ? une demande de connexion, lorsque cela correspond une socket serveur ;
4 donnees = ma_socket.recv(1024) ? la prsence de donnes lire ;
5 except : ? la possibilit dcrire sans tre bloqu.
6 pass Il faut lui fournir en argument trois listes de descripteurs ou socket, correspondant des vne-
7 else : ments :
8 print donnees 1. en entre (lecture ou connexion), 3. exceptionnels.
Ainsi, sil ny a pas de donnes recevoir, une exception est leve. 2. en sortie,
Elle fournit en sortie trois listes mise jour, c--d ne contenant que les descripteurs pour lesquels
Attention
un vnement est survenu.
Dans ce cas l, le programme attend de manire active des donnes ! 1 import select
Vous gaspillez inutilement les ressources de la machine ! 2 (evnt_entree,evnt_sortie,evnt_exception) = select.select(surveil_entree,[],[])
Lappel la mthode select bloque tant quaucun vnement nest pas survenu.
La mthode renvoie 3 listes contenant les descripteurs pour chaque vnement.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 16


27.8 Programmation socket : le select 27.9 Programmation socket : le protocole UDP
Exemple : lancer un accept uniquement lorsquun client essaye un connect. Utilisation du protocole UDP :
1 import sys,os,socket,select 1 import socket
2 adresse_hote =
3 TSAP_local = (, 7777)
3 numero_port = 6688
4 TSAP_distant = (socket.gethostbyname("ishtar.msi.unilim.fr"), 8900)
4 ma_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM,socket.IPPROTO_TCP)
5 ma_socket.bind((adresse_hote, numero_port)) 6 ma_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP)
6 ma_socket.listen(socket.SOMAXCONN) 7 ma_socket.bind(TSAP_local)
7 surveillance = [ma_socket]
9 ma_socket.sendto("Hello", TSAP_distant)
8 while 1:
10 donnees,TSAP_emetteur = ma_socket.recvfrom(1000)
9 (evnt_entree,evnt_sortie,evnt_exception) = select.select(surveillance,[],[])
10 for un_evenement in evnt_entree:
On utilise les mthodes suivantes de lobjet socket :
11 if (un_evenement == ma_socket):
12 nouvelle_connexion, depuis = ma_socket.accept()
? la mthode sendto reoit en paramtre les donnes et le TSAP du destinataire.
13 print "Nouvelle connexion depuis ",depuis
? la mthode recvfrom :
14 nouvelle_connexion.sendall(Bienvenu)
 reoit en paramtre la taille maximale des donnes que lon peut recevoir (sil y a plus de donnes
reues elles seront ignores) ;
15 surveillance.append(nouvelle_connexion)
16 continue
 retourne ces donnes et le TSAP de lmetteur.
17 ligne = un_evenement.recv(1024) Attention
18 if not ligne :
En UDP, on change uniquement un datagramme la fois, dau plus 1500 octets environ.
19 surveillance.remove(un_evenement) # le client sest dconnect
20 else : # envoyer la ligne a tous les clients

28 Multithreading Threads 28.1 Multithreading Smaphores


Il est possible dutiliser directement des fonctions : La classe semaphore
1 import thread Les mthodes sont :
2 def fonction(): Semaphore([val]) fonction de classe retournant un objet Semaphore initialis la valeur
3 # travail optionnelle value
4 thread.start_new(fonction,()) BoundedSemaphore([v]) fonction de classe retournant un objet Semaphore initialis la valeur
optionnelle value qui ne pourra jamais dpasser cette valeur
Mieux : utiliser la classe threading
acquire() essaye de diminuer la smaphore, bloque si la smaphore est zro
Cette classe permet dexcuter une fonction en tant que thread. release() augmente la valeur de la smaphore
Ses mthodes sont :
Thread(target=func) permet de dfinir la fonction transformer en thread, retourne un Exemple dutilisation
objet thread. 1 import threading
start() permet de dclencher la thread 2 class semaphore(Lock):
1 import threading 3 int compteur = 0
2 def ma_fonction: 4 def up():
3 # travail 5 self.acquire()
4 return 6 compteur += 1
5 ma_thread = threading.Thread(target = ma_fonction) 7 return self.release()
6 ma_thread.start() 8 def down():
7 # Thread principale 9 self.acquire()

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 17


29 Manipulations avances : systme de fichier 29.1 Manipulations avances : UDP & Broadcast, Scapy
Informations sur les fichiers Les sockets
Pour calculer la taille dun fichier, il est possible de louvrir, de se placer en fin et dobtenir la Pour la rception de paquets UDP en multicast, il est ncessaire dinformer lOS de la prise en
position par rapport au dbut (ce qui indique la taille) : charge dun groupe par lapplication :
1 mon_fichier = open("chemin_fichier", "r") 1 import struct
2 mon_fichier.fseek(2,0) #On se place en fin, soit zro en partant de la fin 2 mcast = struct.pack("4sl", socket.inet_aton("224.0.0.127"), socket.INADDR_ANY)
3 taille = mon_fichier.ftell() 3 ma_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mcast)
4 mon_fichier.fseek(0,0) # Pour se mettre au dbut si on veut lire le contenu Pour obtenir ladresse IP de la machine que lon utilise :
1 mon_adresse_ip = socket.gethostbyname(socket.gethostname())
Pour connatre la nature dun fichier :
1 import os.path Scapy
2 if os.path.exists("chemin_fichier") : # etc
Le module scapy dispose de capacits traiter le contenu des paquets reus.
3 if os.path.isfile("chemin_fichier") : # etc
Cette bibliothque dinjection de paquets forgs dispose de fonctions danalyse et daffichage
4 if os.path.isdir("chemin_fichier") : # etc
de donnes brutes, raw, comme DNS(), IP(), UDP(), etc.
5 taille = os.path.getsize("chemin_fichier") # pour obtenir la taille dun fichier
1 import scapy

3 # la variable donnees contient le contenu dun paquet DNS


4 analyse = scapy.DNS(donnees)
5 analyse.show()

29.2 Manipulation avances : lcriture de Script systme 29.3 Manipulations avances : construction de listes
Lorsque lon crit un programme Python destin tre utilis en tant que script systme , Il est possible dobtenir une deuxime liste partir dune premire en appliquant sur chaque
c--d comme une commande, il est important de soigner linterface avec lutilisateur, en lui lment de la premire une opration.
proposant des choix par dfaut lors de la saisie de paramtres : La deuxime liste contient le rsultat de lopration pour chacun des lments de la premire
1 #!/usr/bin/python liste.
2 import sys
3 #configuration Il est possible dobtenir le rsultat en une instruction unique pour la construction de cette
4 nom_defaut = "document.txt" deuxime liste.
5 #programme
6 saisie = raw_input("Entrer le nom du fichier [%s]" % nom_defaut) Exemple : on cherche obtenir la liste des lettres en majuscule partir des valeurs ASCII de 65
7 nom_fichier = saisie or nom_defaut (A) 91 (B) :
8 try: 1 [chr(x) for x in range(65, 91)]
9 entree = open(nom_fichier, "r") [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P,
10 except Exception, message: Q, R, S, T, U, V, W, X, Y, Z]
11 print message
12 sys.exit(1)
. en ligne 4, on dfinie une valeur par dfaut pour le nom du fichier ouvrir ;
. en ligne 6, on saisie le nom de fichier avec, entre crochets, le nom par dfaut ;
. en ligne 7, si lutilisateur tape entre , saisie est vide, c--d fausse ;
rsultat : loprateur or affecte la valeur par dfaut, qui est vraie.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 18


30 Pour amliorer lexprience de Python
Des interprtes alternatifs
??
Ils proposent un historique des commandes dj entres dans une session prcdente, la com-
pltion des commandes, de laide contextuelle, etc.
? iPython, http://ipython.org/
? bpython, http://bpython-interpreter.org/
Une configuration particulire de linterprte courant
Lintrt de cette configuration est de fournir les avantages de la compltion et de lhistorique
dans linterprte Python courant et dj install dans le systme.
1. tlcharger le script ladresse suivante :
http://www.digitalprognosis.com/opensource/scripts/pythonrc
2. le sauvegarder sous le nom : ~/.pythonrc
3. ajouter dans son environnement shell la variable suivante :
$ export PYTHONSTARTUP=~/.pythonrc
Ainsi le script sera excut chaque dmarrage de Python.

Cours Python Montit Python P-F. Bonnefoi http://libpfb.so/ 10 septembre 2012 19