Chapitre 8 : Modules

         1 – Définition

    Les modules sont des programmes Python qui contiennent des fonctions que l’on est amené à réutiliser souvent (on les appelle aussi bibliothèques ou libraries). Les développeurs de Python ont mis au point de nombreux modules qui effectuent une quantité phénoménale de tâches. Pour cette raison, prenez le réflexe de vérifier si une partie du code que vous souhaitez écrire n’existe pas déjà sous forme de module. La plupart de ces modules sont déjà installés dans les versions standards de Python. Vous pouvez accéder à une documentation exhaustive sur le site de Python. Surfez un peu sur ce site, la quantité de modules est impressionante.

         2 – Importation de modules

    Jusqu’à maintenant, nous avons rencontré une fois cette notion de module lorsque nous avons voulu tirer un nombre aléatoire.

Code python

>>> import random
>>> random.randint(0,10)
4
Regardons de plus près cet exemple :
L’instruction import permet d’accéder à toutes les fonctions du module random
Ensuite, nous utilisons la fonction (ou méthode) randint(a,b) du module random. Attention cette fonction renvoie un nombre entier aléatoirement entre a inclus et b inclus (contrairement à range() par exemple). Remarquez la notation objet random.randint() où la fonction randint() peut être considérée comme une méthode de l’objet random.
Il existe un autre moyen d’importer une ou des fonctions d’un module :

Code python

>>> from random import randint
>>> randint(0,10)
7
À l’aide du mot-clé from, vous pouvez importer une fonction spécifique d’un module donné. Remarquez que dans ce cas il est inutile de répéter le nom du module, seul le nom de ladite fonction est requis.

On peut également importer toutes les fonctions d’un module :

Code python

>>> from random import *
>>> x = [1, 2, 3, 4]
>>> shuffle(x)
>>> x
[2, 3, 1, 4]
>>> shuffle(x)
>>> x
[4, 2, 1, 3]
>>> randint(0,50)
46
>>> uniform(0,2.5)
0.64943174760727951
Comme vous l’avez deviné, l’instruction from random import * importe toutes les fonctions du module random. On peut ainsi utiliser toutes ses fonctions directement, comme par exemple shuffle(), qui permute une liste aléatoirement.
Dans la pratique, plutôt que de charger toutes les fonctions d’un module en une seule fois (from random import *), nous vous conseillons de charger le module (import random) puis d’appeler explicitement les fonctions voulues (random.randint(0,2)).

Enfin, si vous voulez vider de la mémoire un module déjà chargé, vous pouvez utiliser l’instruction del :

Code python

>>> import random
>>> random.randint(0,10)
2
>>> del random
>>> random.randint(0,10)
Traceback (most recent call last):
File « <stdin> », line 1, in ?
NameError: name ‘random’ is not defined
Vous pouvez constater qu’un rappel d’une fonction du module random après l’avoir vidé de la mémoire retourne un message d’erreur.

Enfin, il est également possible de définir un alias (un nom plus court) pour un module :

Code python

>>> import random as rand
>>> rand.randint(1, 10)
6
Dans cet exemple, les fonctions du module random sont accessibles via l’alias rand.
8.3 Obtenir de l’aide sur les modules importés

Pour obtenir de l’aide sur un module rien de plus simple, il suffit d’invoquer la commande help() :

Code python

>>> import random
>>> help(random)

On peut se promener dans l’aide avec les flèches ou les touches page-up et page-down (comme dans les commandes Unix man, more ou less). Il est aussi possible d’invoquer de l’aide sur une fonction particulière d’un module de la manière suivante help(random.randint).

La commande help() est en fait une commande plus générale permettant d’avoir de l’aide sur n’importe quel objet chargé en mémoire.

Code python

>>> x = range(2)
>>> help(x)
Help on list object:

class list(object)
| list() -> new list
| list(sequence) -> new list initialized from sequence’s items
|
| Methods defined here:
|
| __add__(…)
| x.__add__(y) <==> x+y
|

Enfin, si on veut connaître en seul coup d’oeil toutes les méthodes ou variables associées à un objet, on peut utiliser la commande dir :

Code python

>>> import random
>>> dir(random)
[‘BPF’, ‘LOG4’, ‘NV_MAGICCONST’, ‘RECIP_BPF’, ‘Random’, ‘SG_MAGICCONST’, ‘SystemRandom’,
‘TWOPI’, ‘WichmannHill’, ‘_BuiltinMethodType’, ‘_MethodType’, ‘__all__’, ‘__builtins__’,
‘__doc__’, ‘__file__’, ‘__name__’, ‘_acos’, ‘_ceil’, ‘_cos’, ‘_e’, ‘_exp’, ‘_hexlify’,
‘_inst’, ‘_log’, ‘_pi’, ‘_random’, ‘_sin’, ‘_sqrt’, ‘_test’, ‘_test_generator’,
‘_urandom’, ‘_warn’, ‘betavariate’, ‘choice’, ‘expovariate’, ‘gammavariate’, ‘gauss’,
‘getrandbits’, ‘getstate’, ‘jumpahead’, ‘lognormvariate’, ‘normalvariate’,
‘paretovariate’, ‘randint’, ‘random’, ‘randrange’, ‘sample’, ‘seed’, ‘setstate’,
‘shuffle’, ‘uniform’, ‘vonmisesvariate’, ‘weibullvariate’]
>>>

         3 – Modules courants

    Il existe une série de modules que vous serez probablement amenés à utiliser si vous programmez en Python. En voici une liste non exhaustive. Pour la liste complète, reportez-vous à la page des modules sur le site de Python :

math : fonctions et constantes mathématiques de base (sin, cos, exp, pi…).
sys : passage d’arguments, gestion de l’entrée/sortie standard…
os : dialogue avec le système d’exploitation (e.g. permet de sortir de Python, lancer une commande en shell, puis de revenir à Python).
random : génération de nombres aléatoires.
time : permet d’accéder à l’heure de l’ordinateur et aux fonctions gérant le temps.
calendar : fonctions de calendrier.
profile : permet d’évaluer le temps d’exécution de chaque fonction dans un programme (profiling en anglais).
urllib2 : permet de récupérer des données sur internet depuis python.
Tkinter : interface python avec Tk (permet de créer des objets graphiques; nécessite d’installer Tk).
re : gestion des expressions régulières.
pickle : écriture et lecture de structures Python (comme les dictionnaires par exemple).
Nous vous conseillons vivement d’aller surfer sur les pages de ces modules pour découvrir toutes leurs potentialités.
Vous verrez plus tard comment créer votre propres modules lorsque vous êtes amenés à réutiliser souvent vos propres fonctions.

Enfin, notez qu’il existe de nombreux autres modules qui ne sont pas installés de base dans Python mais qui sont de grand intérêt en bioinformatique (au sens large). Citons-en quelques-uns: numpy (algèbre linéaire, transformée de Fourier), biopython (recherche dans les banques de données biologiques), rpy (dialogue R/Python)…

         4 – Module sys : passage d’arguments

    Le module sys contient (comme son nom l’indique) des fonctions et des variables spécifiques au système, ou plus exactement à l’interpréteur lui-même. Par exemple, il permet de gérer l’entrée (stdin) et la sortie standard (stdout). Ce module est particulièrement intéressant pour récupérer les arguments passés à un script Python lorsque celui-ci est appelé en ligne de commande. Dans cet exemple, oublions l’interpréteur et écrivons le script suivant que l’on enregistrera sous le nom test.py (n’oubliez pas de le rendre exécutable) :

Code python

#!/usr/bin/env python

import sys
print sys.argv
Ensuite lancez test.py suivi de plusieurs arguments. Par exemple :

Code python

poulain@cumin> python test.py salut girafe 42
[‘test.py’, ‘salut’, ‘girafe’, ’42’]
Dans l’exemple précédent, poulain@cumin> représente l’invite du shell, test.py est le nom du script Python, salut, girafe et 42 sont les arguments passés au script.

La variable sys.argv est une liste qui représente tous les arguments de la ligne de commande, y compris le nom du script lui même qu’on peut retrouver dans sys.argv[0]. On peut donc accéder à chacun de ces arguments avec sys.argv[1], sys.argv[2]…

On peut aussi utiliser la fonction sys.exit() pour quitter un script Python. On peut donner comme argument un objet (en général une chaîne de caractères) qui sera renvoyé au moment ou Python quittera le script. Par exemple, si vous attendez au moins un argument en ligne de commande, vous pouvez renvoyer un message pour indiquer à l’utilisateur ce que le script attend comme argument :

Code python

#!/usr/bin/env python

import sys

if len(sys.argv) != 2:
sys.exit(« ERREUR : il faut exactement un argument. »)

#
# suite du script
#
Puis on l’exécute sans argument :

Code python

poulain@cumin> python test.py
ERREUR : il faut exactement un argument.
Notez qu’ici on vérifie que le script possède deux arguments car le nom du script lui-même est le premier argument et file.txt constitue le second.

         5 – Module os

    Le module os gère l’interface avec le système d’exploitation.

Une fonction pratique de ce module permet de gérer la présence d’un fichier sur le disque.

Code python

>>> import sys
>>> import os
>>> if os.path.exists(« toto.pdb »):
… print « le fichier est présent »
… else:
… sys.exit(« le fichier est absent »)

le fichier est absent
Dans cet exemple, si le fichier n’est pas présent sur le disque, on quitte le programme avec la fonction exit() du module sys.

La fonction system() permet d’appeler n’importe quelle commande externe.

Code python

>>> import os
>>> os.system(« ls -al »)
total 5416
drwxr-xr-x 2 poulain dsimb 4096 2010-07-21 14:33 .
drwxr-xr-x 6 poulain dsimb 4096 2010-07-21 14:26 ..
-rw-r–r– 1 poulain dsimb 124335 2010-07-21 14:31 1BTA.pdb
-rw-r–r– 1 poulain dsimb 4706057 2010-07-21 14:31 NC_000913.fna
-rw-r–r– 1 poulain dsimb 233585 2010-07-21 14:30 NC_001133.fna
-rw-r–r– 1 poulain dsimb 463559 2010-07-21 14:33 NC_001133.gbk
0
La commande externe ls -al est introduite comme une chaîne de caractères à la fonction system().

         6 – Exercices

    Conseil : pour les trois premiers exercices, utilisez l’interpréteur Python. Pour les exercices suivants, écrivez des scripts dans des fichiers, puis exécutez-les dans un shell.

Affichez sur la même ligne les nombres de 10 à 20 (inclus) ainsi que leur racine carrée avec 3 décimales (module math). Exemple :
10 3.162
11 3.317
12 3.464
13 3.606
Calculez le cosinus de pi/2 (module math).
Affichez la liste des fichiers du répertoire courant avec le module os. N’utilisez pas la fonction os.system() mais la fonction os.listdir() (lisez la documentation pour comprendre comment l’utiliser).
Écrivez les nombres de 1 à 10 avec 1 seconde d’intervalle (module time).
Générez une séquence aléatoire de 20 chiffres, ceux-ci étant des entiers tirés entre 1 et 4 (module random).
Générez une séquence aléatoire de 20 bases de deux manières différentes (module random).
Déterminez votre jour (lundi, mardi…) de naissance (module calendar).
Exercice +++. Évaluation du nombre par la méthode Monte Carlo.
Soit un cercle de rayon 1 (en rouge) inscrit dans un carré de coté 2 (en bleu).

L’aire du carré R2 vaut soit 4. L’aire du cercle vaut soit .
En choississant N points aléatoires (à l’aide d’une distribution uniforme) à l’intérieur du carré, la probabilité que ces points se trouvent aussi dans le cercle est

Soit , le N nombre points effectivement dans le cercle, il vient alors

d’où

Déterminez une approximation de pi par cette méthode. Pour cela, vous allez, pour N itérations, choisir aléatoirement les coordonnées d’un point entre -1 et 1 (fonction uniform() du module random), calculer la distance entre le centre du cercle et ce point et déterminer si cette distance est inférieure au rayon du cercle. Le cas échéant, le compteur n sera incrémenté.

Que vaut l’approximation de pi pour 100 itérations ? 500 ? 1000 ?

Conseil : pour les premiers exercices, utilisez l’interpréteur Python.