Python et les environnements virtuels

Python et les environnements virtuels

26 mars 2020
Snake au pays des merveilles.


Introduction

La puissance de Python 🐍 vient en grande partie de la myriades de bibliothèques (packages) que l'on peut installer via le gestionnaire de paquets pip. Cependant quand on travaille sur plusieurs projets qui n'utilise pas tous la même version d'une bibliothèque, ni même de Python : ça devient vite le cauchemar.

C'est là que venv intervient pour isoler nos projets Python dans des environnements spécifiques. Chaque environnement virtuel pourra définir la version de Python ainsi que les bibliothèques à utiliser.

Installation

Il existe plusieurs solutions pour la création et l'utilisation des environnements virtuels sous Python. Dans cette article, nous allons parler des deux plus populaires :

  1. venv : un module standard depuis Python 3.3
  2. virtualenv : un outil tiers populaire depuis Python 2.7

L'avantage de venv c'est qu'il est un outil standard intégré à Python. La force de virtualenv c'est qu'il offre une plus grande souplesse de configuration, comme par exemple la possibilité d'utiliser une version précise de Python.

Installation de venv

Si vous avez un Python récent (3.3+) installé sur votre machine, vous avez sûrement déjà accès à venv.

Cependant, sous Debian/Ubuntu, il sera tout de même nécessaire d'installer le paquet python3-venv :

sudo apt-get install python3-venv

Installation de virtualenv

Comme tous les paquets Python, la manière la plus simple de l'installer est d'utiliser pip3 :

pip3 install virtualenv

Création d'un environnement virtuel

C'est surtout à la création de l'environnement virtuel que la syntaxe diffère légèrement entre venv et virtualenv. Dans les deux cas vous allez obtenir un nouveau sous-dossier venv (par défaut) avec :

  • script & fonction bash : activate et deactivate
  • binaires de python, pip et easy_install
  • dossier local pour les packages Python dont dépend le projet (site-packages)

Création avec venv

python3 -m venv ./my-project/venv
  • -m venv (module venv) : le module venv de Python3
  • ./my-project/venv : le dossier de destination (par convention venv)

Création avec virtualenv

# version simple
virtualenv ./my-project/venv

# version avec choix version Python
virtualenv -p /usr/bin/python2.7 venv
  • -p (python) : l'interpréteur Python à utiliser

Utilisation de l'environnement virtuel

Activation

Il faut pour cela utiliser la commande source sur le script activate du dossier venv/bin.

user@host:~$ cd my-project
user@host:~/my-project$ source venv/bin/activate
(venv) user@host:~/my-project$

Une fois l'environnement virtuel activé, l'indication (venv) apparaîtra à gauche de l'invite de commande (prompt).

Installation de paquets

Nous pouvons installer des paquets de manière habituelle via pip, qui seront automatiquement placés dans le dossier local venv.

# exemple d'installation du package 'numpy' depuis un venv activé
(venv) user@host:~/my-project$ pip install numpy

Exécution du script

Quand le venv est activé, il est possible de lancer notre script Python de manière classique.

(venv) user@host:~/my-project$ python main.py

Cependant c'est une version spécifique de Python qui sera utilisée ainsi que les paquets locaux du venv.

Génération du fichier des dépendances

Il est possible (et fortement conseillé 👍) de générer et sauvegarder une liste des paquets Python nécessaire au bon fonctionnement de notre projet. Par convention, on appelle ce fichier requirements.txt. Voilà comment générer cette liste automatiquement via la commande pip du venv.

(venv) user@host:~/my-project$ pip freeze > requirements.txt

Voici le contenu du fichier requirements.txt

numpy==1.18.1

On retrouve notre paquet numpy ainsi qu'un numéro de version 1.18.1.

Installer les dépendances depuis un fichier

Très pratique pour le déploiement du projet Python sur une nouvelle machine, il est possible d'installer toutes les dépendances depuis un fichier. Bien évidemment on va utiliser notre liste requirements.txt précédemment générée.

(venv) user@host:~/my-project$ pip install -r requirements.txt
  • -r (requirements) : le fichier des dépendances

Déactivation

Pour sortir de notre environement virtuel, rien de plus simple : il suffit d'invoquer la commande deactivate.

(venv) user@host:~/my-project$ deactivate
user@host:~$ cd my-project

On note que l'indication (venv) n'est plus visible dans l'invite de commande (prompt). Welcome home! 🏡

Versionnage

Quand on versionne son projet sur Git (ou autre) il faudra respecter deux règles :

  1. ON NE VERSIONNE PAS LE DOSSIER venv !! 😠
  2. On versionne le fichier requirements.txt

Ainsi dans Git on pourra appliquer ces règles via les commandes :

echo '/venv' > .gitignore
git add requirements.txt

En savoir plus

  • Le source du script activate va modifier temporairement notre PATH. Ainsi quand le venv est activé, les commandes python et pip invoqueront automatiquement les binaires installés dans le venv.
  • La commande deactivate n'est pas un fichier script comme activate mais une fonction bash définie dans le fichier activate.
  • Le script activate va également modifier la variable d'environnement PS1 afin de rajouter le nom de votre venv entre parenthèses au début de l'invite de commande (prompt).

Sources