Bien configurer son environnement de développement Python : Les environnements virtuels. Partie 1

C'est quand même plus sympa de développer quand notre environnement de développement est bien configuré ! Ce didacticiel est une introduction en plusieurs parties à quelques bonnes pratiques qui vous permettront d'avoir un environnement de développement Python aux petits oignons. Partie 1 : Travailler avec des environnements virtuels et les associer aux projets.

Cet article fait partie fait partie d'une série d'articles présentant quelques bonnes pratiques qui vous permettront d'avoir un environnement de développement Python aux petits oignons :

Pré-requis

Je considère dans ce tutorial que vous avez déjà installé Python > 2.7.9 et > 3.4.

Ces versions de Python fournissent par défaut pip qui est un outil permettant de télécharger et d'installer des modules Python depuis le Python Package Index (PyPI).

1. Principe de base : Travailler avec des environnements virtuels Python

Les environnements virtuels Python permettent d'avoir des installations de Python isolées du système et séparées les unes des autres. Cela permet de gérer plusieurs projets sur sa machine de développements, certains utilisant des modules de versions différentes, voir même des versions différentes de Python.

Installation de Virtualenv

pip install virtualenv

Exemple d'utilisation

mkdir -p ~/virtualenvs
virtualenv ~/virtualenvs/project1

Virtualenv créait ainsi un environnement Python complètement isolé, dans lequel on va pouvoir installer, mettre à jour, supprimer des modules Python après avoir activé l'environnement :

# Activation de l'environnement
source ~/virtualenvs/project1/bin/activate

# Le path de notre interpréteur Python
(project1) which python
~/virtualenvs/project1/bin/python

# Installer un module, le mettre à jour
(project1) pip install gunicorn
(project1) pip install gunicorn --upgrade
(project1) pip install requests

# Installer une version spécifique d'un module
# ou downgrader vers une version antérieure
(project1) pip install Django==1.8.6
(project1) pip install Django==1.8.5

# Supprimer un module
(project1) pip uninstall requests

# Lister le contenu de notre environnement
(project1) pip freeze
Django==1.8.5
gunicorn==19.4.1
# En enregistrer le contenu
(project1) pip freeze > requirements.txt
# Et pour installer l'ensemble en une commande sur une autre machine
(project1) pip install -r requirements.txt

Tip : Pensez à mettre à jour pip lui-même de temps en temps :

(project1) pip install --upgrade pip

Et pour sortir de l'environnement :

(project1) deactivate

À la création de l'environnement virtuel, vous pouvez choisir si ce dernier hérite ou non des modules du Python système. Par défaut, les modules du Python système ne sont pas hérités. Pour forcer l'héritage :

virtualenv --system-site-packages ~/virtualenvs/project2

Si vous souhaitez utiliser une version spécifique de Python, ou avoir pour un même projet un environnement Python 2 et un autre en Python 3 :

virtualenv ~/virtualenvs/project3-py2 -p /usr/bin/python2.7
virtualenv ~/virtualenvs/project3-py3 -p /usr/bin/python3.4

Aller plus loin avec pip

2. J'ai 99 environnements virtuels, comment me faciliter la vie ?

virtualenvwrapper est la solution, il va nous nous offrir :

  • Une centralisation des environnements virtuels et des projets associés,
  • Une gestion simple des environnements virtuels (création, suppression, copie),
  • Une commande pour passer facilement d'un environnement à l'autre,
  • De l'autocomplétion sur les noms des environnements virtuels,
  • Pour les utilisateurs avancés la possibilité de configurer des hooks par environnement.

Installons et configurons virtualenvwrapper

# Installation
pip install virtualenvwrapper

# Config à ajouter dans ~/.bashrc ou ~/.profile
# - dossier contenant les environnements virtuels
export WORKON_HOME=~/.virtualenvs
mkdir -p $WORKON_HOME
# - dossier contenant les projets associés
export PROJECT_HOME=~/pyprojects
mkdir -p $PROJECT_HOME
# - s'assurer que virtualenvwrapper est toujours disponible
source /usr/local/bin/virtualenvwrapper.sh

Pensez à relancer le terminal pour activer les modifications et permettre à virtualenvwrapper de s'installer (les messages d'installation ne s'afficheront plus par la suite).

Gestion des environnements

# Création d'un premier environnement
mkvirtualenv project1
# L'environnement est créé et automatiquement activé
# Installons Django :
(project1) pip install Django==1.8

# Créons un deuxième environnement
(project1) mkvirtualenv project2
(project2) pip install Django==1.7
(project2) cdvirtualenv
(project2) pwd
~/.virtualenvs/project2
(project2) cdsitepackages
(project2) pwd
~/.virtualenvs/project2/lib/python2.7/site-packages

# Lister les environnements
(project2) lsvirtualenv -b
project1
project2

# Passer d'un environnement à l'autre
(project2) workon project1
(project1) workon project2
(project2)

# Supprimer un environnement
(project2) deactivate
rmvirtualenv project2

Gestion des projets associés aux environnements

# Créer un projet vide et son environnement virtuel associé
mkproject project3
(project3) cdvirtualenv
(project3) pwd
~/.virtualenvs/project3
(project3) cdproject
(project3) pwd
~/pyprojects/project3

Ok, mais comment faire si on a déjà un projet existant depuis longtemps et que l'on ne souhaite pas le redéployer ou en modifier les chemins d'installation ? La commande setvirtualenvproject arrive à la rescousse en permettant d'associer un environnement virtuel existant à un projet existant :

setvirtualenvproject virtualenv_path project_path
# Une fois l'environnement virtuel activé,
# les commandes cdvirtualenv et cdproject sont opérationnelles.

Attention, si l'environnement virtuel n'est pas situé dans le dossier $WORKON_HOME (où les environnements sont créés par les commandes mkvirtualenv et mkproject), il ne sera pas utilisable avec la commande workon. Pour y remédier, il suffit d'y créer un lien symbolique :

cd $WORKON_HOME
ln -s virtualenv_path

Aller plus loin avec virtualenvwrapper

Dans la prochaine partie, nous verrons comment configurer le script de démarrage du shell Python.

Related content
Add comment

Vous pouvez ajouter un commentaire en complétant le formulaire ci-dessous. Le format doit être plain text. Les commentaires sont modérés.

Question: 10 + ten =
Votre réponse: