Odds and ends sur les modules pythons
Quelques particularités sur les modules python :
- comment les exécuter
- comment les organiser en packages
Exécuter des modules
Pour exécuter un module python on peut utiliser l'option -m de l'interpréteur python.
On l'a déjà fait à de multiples reprises en utilisant le module pip :
python -m pip
Le résultat de la commande précédente dans le terminal affichera l'aide de pip.
Exécutez le module random de python dans le terminal avec la commande : python -m random.
Si vous exécutez le module python random, vous verrez s'afficher tout un tas de choses sur l'écran :
$ python -m random
0.000 sec, 10000 times random()
avg 0.498948, stddev 0.285393, min 1.74181e-05, max 0.999923
0.003 sec, 10000 times normalvariate(0.0, 1.0)
avg -0.00160272, stddev 1.00174, min -3.42565, max 3.90493
0.003 sec, 10000 times lognormvariate(0.0, 1.0)
avg 1.64736, stddev 2.19193, min 0.0147119, max 65.9514
0.004 sec, 10000 times vonmisesvariate(0.0, 1.0)
avg 3.11325, stddev 2.28549, min 0.000433248, max 6.28223
0.009 sec, 10000 times binomialvariate(15, 0.6)
avg 8.9936, stddev 1.89413, min 2, max 15
[...]
Ces lignes montrent le temps mis pour générer des nombres aléatoires selon plusieurs lois de probabilités.
Cette technique est très utilisée pour permettre d'effectuer des commandes directement avec le terminal (comme pip) ou pour montrer l'usage que l'on peut faire du module (comme random)
Mais pourquoi ces lignes ne s'affichent-elles pas lorsque l'on importe le module random ?
Python distingue les deux types d'exécutions d'un programme via la variable spéciale __name__ :
- elle vaut la chaîne de caractères
"__main__"si le fichier est exécuté directement - elle vaut le nom du fichier s'il est exécuté via un import
Créez un fichier nommé test_exécution.py et copiez/collez y le code suivant :
print(__name__)
Exécutez le fichier précédant directement avec l'interpréteur puis via un import. Vous pourrez créez puis exécuter un fichier contenant uniquement la ligne de code import test_exécution.
Cette différence dans le nom d'une variable permet de différentier les deux types d'exécution et est parfois utilisé pour séparer le programme principal d'un fichier du reste du code avec :
# code pouvant être importé
if __name__ == "__main__":
# code du programme principal
Package
Lorsqu'un module devient important, il devient compliqué de mettre tout son code dans un seul fichier. On a alors coutume de rassembler tout le code du module dans un dossier que python appelle package. Ces packages pourront ensuite être réutilisés dans d'autres projets, voir être directement placés sur https://pypi.org/ pour être utilisés par d'autres.
Comme l'import d'un module revient à exécuter un fichier et qu'importer un package revient à importer un dossier, python exécute le fichier __init__.py présent dans le dossier.
Un package est un dossier contenant un fichier __init__.py.
-
importer le dossier revient à exécuter le fichier
__init__.py. -
exécuter le dossier avec l'interpréteur revient à exécuter le fichier
__main__.py.
Enfin, on peut faire en sorte que nos modules/packages soient exécutables directement avec un interpréteur :