[wiki: Système et réseau]
—-
Module sys
Ce module donne accès aux informations et aux commandes du système d’exploitation.
sys.path: liste des chemins ou sont recherchés les modules importés.sys.argv: liste des arguments utilisés lors de l’appel au programme python.sys.exit(): fonction qui permet de sortir du programme en cours d’éxécution.
#!html
<br clear=right>
—-
Module os
Ce module permet de manipuler les différentes ressources de l’ordinateur (fichiers, répertoires, processus, …) de façon neutre vis à vis du système d’exploitation sous-jacent.
os.name:posix(unix ou MacOS X),nt(windows),mac(avant MacOS X), oujava(jython).getcwd(): renvoie le chemin menant au répertoire courant.abspath(path): renvoie le chemin absolu depath.listdir(path): renvoie une liste contenant tous les fichiers et sous-répertoires depath.exists(path): renvoieTruesipathdesigne un fichier ou un répertoire existant,Falsesinon.isfile(path): renvoieTruesipathest un fichier,Falsesinon.isdir(path): renvoieTruesipathest un répertoire,Falsesinon.
#!html
<br clear=right>
—-
Module re
Les expressions régulières permettent de réaliser des tests ou des transformations complexes sur des chaînes de caractères. L’opération à effectuer est elle-même décrite à l’aide d’une chaîne de caractère spéciale, le « motif » (pattern), dont les caractères ont un sens particulier.
Quelques éléments de syntaxe :
- « . » : n’importe quel caractère.
- « ^ » : début de la chaîne ou de la ligne.
- « $ » : fin de la chaîne ou de la ligne.
- « * » : 0 à n fois le caractère précédent.
- « + » : 1 à n fois le caractère précédent.
- « ? » : 0 à 1 fois le caractère précédent.
- « \ » : caractère d’échappement.
- « [ABC] » : le caractère ‘A’ ou ‘B’ ou ‘C‘.
- « [a-z] » : n’importe quelle lettre minuscule.
- « [0-9] » : n’importe quel chiffre.
Quelques fonctions du module re :
- match() : validation conformité chaine.
- search() : test de présence.
- findall() : recherche tous les éléments.
- finditer() : itérateur de recherche.
- sub() : remplacement de sous-chaine.
- compile() : compilation pour optimisation.
- Quand c’est possible, l’usage des méthodes du module
stringest plu ssimple.
Exemple, analyseur d’adresses web :
# L'expression compilee
exp = re.compile(r"(.*)://([^\/]*)(.*)")
# Definition de la fonction d analyse d adresse
def GetInfosFromURL(url):
try:
return exp.match(url).groups()
except:
return ""
# Analyse d'adresses
protocol, server, path =
GetInfosFromURL("http://doc.python.org/library/re.html")
# Affiche : Protocol : http, Serveur : doc.python.org, Path : /library/re.html
print "Protocol : %s, Serveur : %s, Path : %s" % (protocol, server, path)
#!comment
# L'expression compilee
exp = re.compile(r"^\s*([\w]+)\.([\w]+)\s*=\s*(.*?)\s*$", re.MULTILINE)
# Definition de la classe d'analyse
class Config(dict):
"""Cette classe lit un fichier de configuration et enregistre les
proprietes dans un dictionnaire."""
def init (self, conf file):
dict.init(self)
for p, k, v in exp.findall(file(conf_file).read()):
if not self.has_key(p):
self[p] = {}
self[p][k]=v
# Appel de la fonction d'analyse avec un fichier de configuration
conf_params = Config("ldap.conf")
# Affiche : {'dn': 'uid=simon,ou=person,o=llr,o=com', 'bidon': 'test', 'port': '389', 'server': 'localhost'}
print conf_params["ldap"]
# Affiche : {'port': '8080', 'timeout': '10000', 'server': '127.0.0.1'}
print conf_params["apache"]
#!html
<br clear=right>
—-
Threads
Gestion des threads
- Exécution parallèle de plusieurs fonctions.
- Souvent utilisés pour, par exemple :
- Séparer traitement des données, de l’interface graphique.
- Exécuter les mêmes opérations sur plusieurs jeux de données.
- Interruption temporisée : « Timer », exécutée tous les xx secondes.
- Synchronisation, avec des verrous sur des variables : « locks » ou Files d’attente : « queues ».
- Temps de partage de CPU dépendent beaucoup de l’OS.
- Python propose, de base, 2 modules (historique) :
threadetthreading. Le modulethreadingpropose plus de méthodes.
#!comment
- Attention, pas de priorité d’exécution possible, au contraire des MFC Windows → passer par des processus, plutôt que des threads, si l’on souhaite gérer les priorités.
Modules thread/threading
start(): permet de démarrer un thread.run(): méthode appelée lors de l’exécution du thread.isAlive(): savoir si le thread est toujours en vie.Lock(): classe d’objet de verrouillage de données.acquire(): permet de verrouiller une variable.release(): permet de déverrouiller une variable.Queue(): permet de créer une file d’attente.put(): permet de placer un élément dans la file.get(): permet de récupérer un élément dans la file.empty(): permet de savoir si la file d’attente est vide.join(): attendre la fin d’exécution du thread.Timer(): permet de créer un objet Timer.
Plus de threads !
- Vu que la priorité n’est pas gérée directement, si vous multipliez les threads, il peut y avoir à un moment donné, un ralentissement de tous … La cause : le CPU.
- Pour le traitement des données massivement parallèle, il existe les calculs sur carte graphique.
- Le processeur graphique GPU prend la main, mais l’affichage peut s’en trouver affecté si l’on n’installe pas plusieurs cartes graphiques …
- Modules Python disponibles :
pyCUDA,pyOpenCL, mais ça, c’est une autre histoire …
Exemple de Thread
# Fonction de simulation de nettoyage de file d'attente
def CleanQueue(path):
# Liste des 'jobs‘
jobs_list = os.listdir(path)
# Pour tous les 'jobs‘
for job in jobs_list:
del_path = "%s/%s" % (path, job)
# Retire ...
os.remove(del_path)
print "Suppression de " + del_path
# Chemin des jobs
queue_path = "/tmp/queue"
# Demarre les threads (ici, de BASE)
thread.start_new(CleanQueue, (queue_path, ))
thread.start_new(CleanQueue, (queue_path, ))
while True:
# Rien a faire ...
# Ctrl+C pour arreter
pass
Exemple de Timer
# Fonction de simulation de nettoyage de file d'attente
def CleanQueue(path):
# Liste des 'jobs‘
jobs_list = os.listdir(path)
# Pour tous les 'jobs‘
for job in jobs_list:
del_path = "%s/%s" % (path, job)
# Retire ...
os.remove(del_path)
print "Suppression de " + del_path
# Chemin des jobs
queue_path = "/tmp/queue"
# Attente a programmer
wait_time = 600 # = 10 minutes
# Creation du thread temporise
wake_call = threading.Timer(wait_time, CleanQueue, (queue_path, ))
# Demarrage du thread temporise
wake_call.start()
Exercices
- Créez une fonction qui affiche la date et l’heure.
- Créez 2 Threads qui exécutent cette fonction.
- Créez ensuite un Timer qui permet d’exécuter la fonction d’affichage toutes les 5 secondes.
#!html
<br clear=right>
—-
Réseau
Vaste domaine de communication … avec de nombreux protocoles : FTP, HTTP, SMTP, NNTP, NTP, IMAP, etc.
- Python a, dans sa bibliothèque standard, tous les modules pour répondre à ces problématiques.
- Principes de base :
- Un ou plusieurs clients dialogue(nt) avec un serveur, à l’aide d’un noeud appelé « socket ».
- Les communications sont transmises par différents protocoles.
- Il existe plusieurs couches prédéfinies de protocoles de communication : couches OSI.
Client FTP : module ftplib
Liste des commandes usuelles :
FTP(): permet de créer la connexion avec le serveur FTP.login(): identification sur le serveur, si ce n’est pas déjà fait dans la méthode FTP().nlst(): liste les fichiers distants.retrlines("LIST"): envoie la commande LIST pour lister les fichiers distants.storbinary(): envoie le fichier vers le serveur distant, dans l’arborescence courante.retrbinary(): réceptionne un fichier depuis le serveur distant.rename(): renomme le fichier distant.cwd(): change le répertoire courant sur le serveur distant.mkd(): crée un répertoire sur le serveur distant.delete(): supprime un fichier distant.close(): ferme la connexion.
Exemple
import ftplib
...
ftp = ftplib.FTP(FTP_SERVER_ADDRESS,FTP_SERVER_LOGIN, FTP_SERVER_PASSWD)
print ftp.nlst('public_ftp') # Liste les fichiers distants
print ftp.retrlines('LIST') # Autre facon de lister
# Chemin du fichier a transferer
# Transfere un fichier
local_file_name = "code_wol.py"
local_file = open(local_file_name , 'rb')
ftp.storbinary("STOR %s" % local_file_name, local_file)
local_file.close()
ftp.close()
Client NNTP (Network News Transfer Protocol) : module nntplib
Lecteur de !NewsGroup.
NNTP(): Connexion au serveur.group(): récupère les informations sur un groupe de discussions.xhdr(): sélectionne une liste de sujets de discussion.quit(): ferme la connexion avec le serveur.
Exemple :
import nntplib
s = nntplib.NNTP("news.gmane.org")
resp, count, first, last, name = s.group('gmane.comp.python.committers')
print 'Groupe %s, a %s articles : [%s..%s]' % (name, count, first, last)
# Selectionne les 10 derniers
resp, subs = s.xhdr('subject', first + '-' + last)
for id, sub in subs[-10:]:
print id, sub
s.quit()
Client IMAP (Internet Message Access Protocol) : module imaplib
Lecteur d’emails.
IMAP4_SSL(): Ouvre une connexion sécurisée (TLS) avec le serveur.IMAP4(): Ouvre une connexion non sécurisée.login(): Identification sur le serveur distant.select(): Sélectionne le répertoire à parcourir.search(): Lance une recherche sur la boite.fetch(): Extrait les messages.logout(): Déconnexion de l’utilisateur.close(): Ferme la connexion avec le serveur.- Attention : le programme va changer l’état lu / non lu de vos messages dans votre boite aux lettres.
Exemple :
import imaplib
imap_serv = imaplib.IMAP4_SSL(IMAP_SERVER_ADDRESS,IMAPS_SERVER_PORT)
imap_serv.login(IMAP_SERVER_LOGIN, IMAP_SERVER_PASSWORD)
imap_serv.select() # INBOX par défaut
type, data = imap_serv.search(None, 'ALL')
nb_msg = len(data[0].split())
print " > Nombre de messages : %d" % (nb_msg)
# Affichage des messages trouves
for num in data[0].split():
type, data = imap_serv.fetch(num, '(RFC822)')
print ' --> Message %s\n' % (num)
print '%s' % (data[0][1])
print '--------------------------------------------------\n'
imap_serv.close()
imap_serv.logout()
Client HTTP (!HyperText Transfer Protocol)
Lecture et envoie des commandes par objet « socket » de base.
socket(): création de la socket.connect(): ouverture de la connexion avec le serveur.send(): envoie de données sur la socket.recv(): réceptionne des données depuis le serveur.close(): ferme la socket.- Plus de fonctionnalités (analyse de page sous forme XHTML) dans le fichier [raw-attachment:code_client_http.py code_client_http.py].
Exercices
- Utilisez fichier [raw-attachment:code_client_imap.py code_client_imap.py], réglez vos identifiants et serveur pour tester l’accès à votre boite aux lettres. Attention, n’oubliez pas de supprimer les constantes de connexion après.
- Utilisez le fichier [raw-attachment:code_client_http_base.py code_client_http_base.py], pour tester la connexion avec un serveur Web distant.
- Utilisez le fichier [raw-attachment:code_nntp_client.py code_nntp_client.py] pour tester la lecture de plusieurs sujets de newsgroup.
—-