Ce cours prĂ©sente comment utiliser, mettre en place et partager un environnement de code fonctionnel. Cela assure la portabilitĂ© de votre application pour que l’on puisse l’utiliser ailleurs que sur votre poste.
Pour information : Les exemples présentés dans le cours seront disponibles ici : https://github.com/conception-logicielle-ensai/exemples-cours/tree/main/cours-3
Accroche
Depuis un terminal, faites les commandes suivantes :
pip install helloensai
python3 -m helloensai
Que s'est il passé ?
- Vous avez téléchargé un package avec un gestionnaire de paquet :
pip
- Ce package a ensuite été importé et utilisé directement en ligne de commande via python3, installé sur votre machine
- Il a executé du code python : un print dans votre console.
Optionnel: Faire en sorte de changer l’output du lancement de la commande python3 -m helloensai
a partir du message dans la console.
Interpréteur/Compilateur

Python appartient à la catégorie des langages interprétés (tout comme Javascript et R, par exemple).
Un langage interprété possÚde un interpréteur (on parle aussi de runtime
)
Pour exĂ©cuter un code d’un langage interprĂ©tĂ©, il faut 2 choses :
- Le code source à exécuter : votre fichier
main.py
par exemple - Un interprĂ©teur : Pour python, il s’agit de la commande
python
(python3
sur certains systĂšmes pour le distinguer de python 2,python.exe
sur certains systĂšmes d’exploitation infĂ©rieurs)
Pour vĂ©rifier que l’interprĂ©teur python
est bien disponible sur le systĂšme, on peut lancer la commande
python --version
python3 --version
Remarque : il peut ĂȘtre disponible sur votre systĂšme mais pas dĂ©fini dans un endroit connu du systĂšme voir : https://medium.com/towards-data-engineering/understanding-the-path-variable-in-linux-2e4bcbe47bf5
Sidequest : si vous vous demandez oĂč
python
est installé, vous pouvez utiliser la commandewhich
(ouwhere
pour les systĂšmes Windows)
Pour les languages compilés, il faut un compilateur qui nous permet depuis notre language a un autre language, souvent de plus bas niveau, executable soit directement par la machine soit par un autre interpréteur.
Pour python, on entend souvent parler de cython : “https://cython.org/"
Il existe également des transpileurs, pour convertir des languages en autres languages : ex pour javascript : https://fr.javascript.info/polyfills
Environnement d’execution : runtime
Cette partie s’attele a prĂ©senter ce qu’on appelle l’environnement d’execution.
L’environnement d’execution, est l’ensemble des paramĂštres constituant le contexte d’execution du code:
- L’OS et les fonctions noyau liĂ©es (puisque les fonctions des programmes s’appuyent dans leur coeur a des fonctions noyau)
- Les librairies / modules installés
- Pour la version de python
- La configuration du code
PrĂ©ambule : Qu’est ce qu’un gestionnaire de paquets
Lorsque vous voulez travailler avec des fichiers informatiques, les gestionnaires de paquets sont lĂ pour vous.
Ils permettent :
- d’installer/mettre Ă jour/dĂ©sinstaller des logiciels/outils/code.
Il en existe une Myriade, pour différents usages, languages.
apt
,snap
pour l’installation de paquet debian de maniĂšre simplifiĂ©echocolatey
scoop
brew
pour l’installation de logiciels MacOSX et Windowspip
poetry
pour l’installation de modules python.npm
yarn
pour l’installation de packages javascriptmaven
gradle
pour l’installation de packages java
Il faut en général pour définir un gestionnaire de paquets :
- Une norme sur le format partagĂ© (.whl, .tar, …)
- Une dĂ©finition d’un standard pour un hĂ©bergeur :
pypi.org
dockerhub
… Cela permet d’hĂ©berger soit mĂȘme et de partager sur des hĂ©bergeurs - Une dĂ©finition sur le mode de rĂ©cupĂ©ration du format a partir d’un serveur central.
Qu’est ce que pip
pip c’est un gestionnaire de paquets pour python
C’est l’installeur de premier choix quand il s’agit d’ajouter des dĂ©pendances (modules) Ă un projet python.
Il s’utilise principalement pour l’installation ou la desinstallation de module sur votre systĂšme.
pip uninstall <package>
pip install <package>
Lien vers la référence de la commandepip uninstall <package>
Lien vers la référence de la commandeTout cela avec des petites verifications pour éviter de télécharger les mauvaises dépendances
Remarque la commande peut Ă©galement ĂȘtre pip3 selon votre environnement.
Modules et dépendance

Source https://xkcd.com/2347/
- Module : Un module Python est un fichier contenant du code Python (fonctions, classes, variables) pour structurer et rĂ©utiliser le code. On peut l’importer avec import.
- DĂ©pendance : Une dĂ©pendance est une bibliothĂšque externe nĂ©cessaire Ă un projet, comme matplotlib pour crĂ©er des graphiques, requests pour faire des requetes http, psycopg2 pour faire des connexions a des bases de donnĂ©es postgresql…
Fonctionnellement, a part le contrat d’interface sur l’import, le fonctionnement est Ă©quivalent, une fois l’import effectuĂ©.
Wheel : Le format de référence
Lorsque vous installez des packages par l’extĂ©rieur vous utilisez dĂ©jĂ probablement des fichiers wheel ou .whl
.
Une wheel est essentiellement un zip, ou tar qui a un nom qui peut ĂȘtre parsĂ© par pip pour lui permettre de l’installer de maniĂšre adaptĂ©e sur votre environnement cible.
Regardez plutĂŽt : {dist}-{version}(-{build})?-{python}-{abi}-{platform}.whl
Exemple :
requests-2.31.0-py3-none-any.whl
Ce qui donne:
{requests}-{2.31.0}-{py3}-{none}-{any}
Ce genre de spĂ©cification est commune a tous les languages dignes de ce noms, puisqu’harmoniser un mode de livraison pour un gestionnaire de paquets harmonisĂ©s et cohĂ©rents, cela permet une compatibilitĂ© assurĂ©e entre les diffĂ©rents outils qui les utilisent.
Les PEP ou Python Enhancement Proposal sont les Ă©volutions et propositions d’Ă©volutions du language.
Les principales propositions d’amĂ©liorations de python qui concernent le packaging sont les suivantes :
Comment packager ? => Wheels : PEP 427.
Comment sont construit les numeros de version. Par quelle sémantique ? => PEP 440
DĂ©finir les dĂ©pendances d’un package pour permettre la rĂ©solution des dĂ©pendances mutuelles : PEP 508
Comment build ? PEP 517
Index du “tuto” Pypi pour construire et dĂ©ployer un livrable : Build and publish section
Isolation des environnements d’execution : Environnements virtuels

Pour une isolation des paquets installĂ©s, et ne pas utiliser tout ce qui existe dĂ©jĂ sur un poste, python permet l’utilisation d’environnements virtuels (virtualenv ou venv).
Ils s’installent au travers du module venv ex :
python3 -m venv ./venv
Cela installe un environnement dans le sous dossier ./venv par rapport au terminal executant le module.
Note: cet environnement ne doit pas ĂȘtre versionnĂ© et donc votre gitignore doit bien le gĂ©rer.
Une fois mis en place, vous pouvez le lancer en utiliser la commande en fonction de l’OS:
Environnement | Terminal | commande |
---|---|---|
MacOs | bash | source <venv>/bin/activate |
Linux | bash | source <venv>/bin/activate |
Windows | cmd.exe | <venv>\Scripts\activate.bat |
Windows | powershell | <venv>\Scripts\Activate.ps1 |
diffĂ©rents moyens vĂ©rifier que vous ĂȘtes dans un venv - pip list –local (il n’y a pas grand chose) - Vous avez maintenant une parenthĂšse vous indiquant que vous ĂȘtes bien dans votre venv dans votre terminal - consulter l’interpreteur python dans votre vscode
đ„ Attention Ă ne pas le versionner toutefois, rĂ©ferez vous au .gitignore du chapitre git pour plus d’informations
đ maintenant vous pouvez mettre en place l’environnement via pip install -r requirements.txt par exemple
Une solution classique pour un statisticien est d’utiliser l’environnement virtuel conda, il propose un gestionnaire de package integrĂ© dans un environnement integrĂ© prĂȘt a l’emploi pour le statisticien.
Par exemple il y a le package pandas trÚs utilisé pour le travail sur des dataframe.
Cela peut notamment ĂȘtre utile dans des environnements contraints de passer par des venvs packagĂ©s afin de pouvoir travailler librement avec des outils rendus portables par le mode de livraison de conda
Documentation ici : https://docs.anaconda.com/getting-started/
Canoniser l’environnement d’execution

Pip et un fichier canonique : requirements.txt
Pour mieux partager un environnement qui permet de faire tourner le code,
pip propose de sanctuariser les dĂ©pendances dans un fichier requirements.txt. C’est l’Ă©quivalent des fichiers package.json
en Javascript (npm), pom.xml
(Java / maven) …
Exemple de fichier requirements.txt:
fastapi
uvicorn
requests
pytest==5.6.7
selenium==1.0.2
flake8
Ce fichier permet de simplifier l’installation des dĂ©pendances en les regroupant dans un fichier, on peut ensuite demander aux utilisateurs/dĂ©veloppeurs de faire :
pip install -r requirements.txt
Le fichier requirements.txt doit ĂȘtre versionnĂ© avec votre code sur git
Bien Ă©videmment, cela est pertinent a condition d’ĂȘtre dans un environnement virtuel nu
Remarque: On peut Ă©galement copier un environnement d’execution fonctionnel a partir de la fonction pip freeze
pip freeze > requirements.txt
Remarque, pip freeze ne fait que des opĂ©rations trĂšs basiques (lister l’environnement et le sortir dans un message). Il faut donc soit partir d’un environnement d’abord propre (environnement virtuel puis installation de toutes les dĂ©pendances), ou utiliser une autre librairie
Il existe un linter qui permet de générer a partir d'une base de code, une approximation du fichier requirements.txt lien vers la documentation https://pypi.org/project/pipreqs/
Poetry : une alternative sérieuse à pip simplifiant la gestion des dépendances
Projet plus rĂ©cent, rĂ©pondant a des besoins d’usage non couverts/ mal couverts par pip.
Plusieurs limites existent dans l’utilisation de pip pour un projet de taille rĂ©elle :
- Gestion des conflits dans l’installation de packages
- Mauvaise gestion des versions de python // paquets
- Praticité de la réalisation de package sur Pypi
- Gestion fine des dĂ©pendances pour les environnements d’execution du code (on ne veut pas les dĂ©pendances liĂ©es au tests ou a des lignes de commandes qu’on souhaite lancer sur le projet par exemple)
- Gestion des venv pour le projet par rapport aux prérequis (version de python etc..)
- PerennitĂ© dans l’installation de package figeant dans le temps une version fonctionnelle du code.
Ici, poetry intĂšgre les notions de versionning, de versions courantes fonctionnelles et crĂ©e un lien entre packages et environnement virtuel oĂč l’on execute, ce qui limite naturellement quelques eceuils.
Pour ce qui est du packaging, poetry est un facilitateur dans la mise en place de la configuration pour le dĂ©ploiement de package. Tout est dans un fichier qui est le mĂȘme que le fichier de versionning du projet, mais Ă©galement tout s’effectue d’un seul coup et avec un seul outil.
Pour dĂ©marrer il faut l’installer
pip install poetry
et pour démarrer une config pour poetry :
poetry init
Ensuite pour ajouter des package a un projet poetry : et pour démarrer une config pour poetry :
poetry add requests
Poetry fonctionne avec un fichier pyproject.toml
qui est bien plus complexe que le simple fichier requirements.txt
. C’est plus propre et cela vous permet d’administrer en fonction des versions de python les installation et les environnements virtuels a construire dans le projet.
Vous ĂȘtes libre dans le choix du gestionnaire de package (un autre Ă©galement : pipenv ), mais vous devrez respectez la rĂšgle suivante : votre code devra pouvoir ĂȘtre rĂ©cupĂ©rĂ© et lancĂ© de maniĂšre explicite (quelles commandes permettent d’arriver a un environnement fonctionnel dans le fichier README.md dans une section dĂ©diĂ©e)
Creation d’un package
Les gestionnaires de paquets permettent a la fois d’utiliser des paquets existants, mais vous le devinez bien, il est possible d’en crĂ©er vous mĂȘme.
Les dĂ©pots de packets peuvent ĂȘtre :
- privĂ©s - c’est le cas dans les entreprises en gĂ©nĂ©ral
- publics :
- c’est le cas du dĂ©pĂŽt pypi https://pypi.org/ , vers lequel pointe par dĂ©faut une installation de pip.
- mais également du dépÎt de test : https://test.pypi.org/
L’idĂ©e de la crĂ©ation d’un package est de crĂ©er une brique rĂ©utilisable de composants fonctionnels.
Cela peut ĂȘtre par exemple la rĂ©utilisation de classes entre diffĂ©rents projets ou la sauvegarde d’un sous ensemble de fonctions utiles que vous aimez utiliser sur les diffĂ©rents projets sur lesquels vous travaillez.
Un package en python a cette forme :
projet
âââ LICENSE
âââ src/
â âââ package
â âââ __init__.py
â âââ t.py
âââ tests/
âââ README.md
âââ pyproject.toml
A la racine du package se trouve :
- un fichier pyproject.toml, qui contient des mĂ©tadonnĂ©es sur la version, le nom de l’application, etc.. => Il s’agit d’un fichier python qui permet ensuite de construire un “livrable” au sens de python, prĂȘt a ĂȘtre envoyĂ©.
- Un fichier LICENSE pour prĂ©ciser le mode d’usage et de partage du package
- un fichier README pour dĂ©crire l’usage
Puis il faut, dans cet ordre :
- construire le livrable (avec un outil comme
buildtools
) - envoyer le livrable (avec un outil comme
twine
)
Comment packager un projet ? :
https://packaging.python.org/en/latest/tutorials/packaging-projects/
Travaux Pratiques
L’objectif de ce TP est de manipuler les Ă©lĂ©ments de packaging. En effet, pour assurer la portabilitĂ© applicative, on sera amenĂ© a canoniser l’environnement d’execution de nos applicatifs.
1 ) Modules python
- Si vous ne l’avez pas fait, installez le package
helloensai
avec pip et lancez le via une commande python. - Consultez les projets exemples : 1 , 2, 3. Répondez aux questions suivantes : est ce que le projet détaille comment arriver sur le projet? quel est le gestionnaire de paquet privilégié pour le projet ?
2 ) Portabilité applicative
- Dans un dossier bien choisi (par exemple votre projet ensai), créez un environnement virtuel et activez le.
- Veillez a éviter que le venv soit non versionné.
- Réfléchissez aux dépendances éventuelles pour former un fichier
requirements.txt
ou un fichierpyproject.toml