[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), ou java (jython).getcwd() : renvoie le chemin menant au répertoire courant.abspath(path) : renvoie le chemin absolu de path.listdir(path) : renvoie une liste contenant tous les fichiers et sous-répertoires de path.exists(path) : renvoie True si path designe un fichier ou un répertoire existant, False sinon.isfile(path) : renvoie True si path est un fichier, False sinon.isdir(path) : renvoie True si path est un répertoire, False sinon.
#!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
string est 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) :
thread et threading. Le module threading propose 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.
—-
Attachments