BibliosSys

[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