I. Introduction▲
Le terme « Virtualenv » décrit à la fois un outil et ses créations. L'outil va permettre de créer un ensemble de dossiers et de fichiers qui constitueront une virtualenv.
Les virtualenvs sont couramment utilisées en entreprise, où il est souvent nécessaire d'avoir plusieurs configurations en parallèle de Python afin de tester les applications, leur déploiement ou encore de travailler sur plusieurs projets à la fois et cela sans conflit.
Imaginez que vous disposez de deux scripts Python, le premier utilisant la version 1 d'un module, et le second la version 2 du même module. Vous ne pouvez pas faire cohabiter ces deux versions d'un même module. C'est ici que les virtualenvs révèlent leur utilité.
Elles permettent de compartimenter une installation Python. Chaque logiciel possède alors sa virtualenv attitrée, ce qui permettra de faire tourner plusieurs logiciels Python en parallèle avec différentes versions et modules de Python potentiellement incompatibles entre eux.
Virtualenv est l'outil pour Python 2.x. Python 3.x est livré avec son propre outil dont la documentation officielle se trouve ICIhttps://docs.python.org/3/library/venv.html. En cas d'absence de pyvirtualenv, utilisez « python -m virtualenv » où python sera votre installation 3.x.
II. Principe de fonctionnement▲
Au lieu de lancer directement votre programme, vous commencez par activer votre environnement virtuel dans une console, puis vous appelez votre programme.
De fait, votre programme n'utilisera pas l'installation Python du système, mais exclusivement celle de votre virtualenv. Cela signifie que votre programme est alors totalement compartimenté, et qu'il ne va pas interférer avec d'autres programmes Python.
Tout module installé dans une virtualenv, n'est accessible, et visible, qu'à l'intérieur de cette virtualenv.
Parmi les contraintes que cela impose, nous retiendrons principalement le fait qu'une fois créée, déplacer une virtualenv est fortement déconseillé, au risque de la voir ne plus fonctionner. Dans l'idéal, vous devez la créer à chaque fois dans son lieu d'exécution.
Néanmoins, une option d'installation, que nous verrons plus loin, tente de pallier ce souci. Il s'agit cependant d'une contrainte minimale par rapport aux avantages fournis.
III. Prérequis▲
Tout d'abord, vous devez bien évidemment disposer d'une installation fonctionnelle de Python.
Une fois n'est pas coutume, le moyen le plus simple d'installer l'outil est de passer par pypi. Pour cela, utiliser l'outil piphttps://pip.pypa.io/en/latest/installing.html que vous pouvez installer grâce à la commande suivante :
python get-
pip.py
Quel que soit votre système, je vous recommande de passer root/administrateur pour l'installation.
IV. Installation▲
Une fois cela fait, utilisez simplement la commande suivante :
pip install virtualenv
IV-A. Options▲
La commande virtualenv dispose d'un certain nombre d'options utiles dont voici les principales :
Option |
Description |
-v |
Mode verbeux |
-q |
Mode silencieux |
-p |
Indique la version de python à utiliser. Par défaut la version par défaut du système est choisie, mais vous pouvez indiquer une autre version. |
--system-site-packages |
Autoriser la commande à avoir accès à tous les paquets système. Par défaut, sans cette option, seuls les paquets Python seront accessibles. |
--always-copy |
Empêche la création de liens symboliques et impose la copie de fichiers. Plus volumineux au final, mais évite parfois des soucis. |
--relocatable |
Passer les chemins de la virtualenv du mode absolu au mode relatif. Est censé permettre de déplacer la virtualenv. ATTENTION : n'est utilisable que sur une virtualenv existante. |
--no-pip |
Empêche l'installation de pip sur la virtualenv. |
V. Création d'une virtualenv▲
virtualenv -
p python2.7
--
system-
site-
packages /
home/
alex/
test/
my_virtualenv
virtualenv --
relocatable /
home/
alex/
test/
my_virtualenv
Voici la ligne de commande classique : on stipule la version de python à utiliser, ici la 2.7, et on autorise l'accès à tous les paquets.
Puis, une fois la virtualenv créée, on utilise l'option relocate afin de pouvoir déplacer notre virtualenv.
Voici notre virtualenv créée à l'endroit demandé.
Nous pouvons constater que la version de Python qui est embarquée est bien celle demandée, à savoir la 2.7.
VI. Manipulation d'une virtualenv▲
VI-A. Activation▲
Pour lancer votre environnement, rien de difficile : rendez-vous dans un des sous-dossiers à la recherche du script « activate », et lancez-le de la façon suivante :
. activate
Comme on peut le voir, une fois rentré dans une virtualenv, le prompt de la console est précédé du nom de la virtualenv, de sorte que l'on sait toujours dans quel environnement on se trouve. Pour cette raison, il est important de toujours choisir un nom explicite pour nos virtualenvs.
VI-B. Désactivation▲
Pour éteindre une virtualenv en cours d'utilisation, rien de compliqué, il suffit d'appeler le script deactivate.
deactivate
VI-C. Lancement d'un programme avec une virtualenv▲
Pour bien illustrer le sujet, le programme suivant indiquera le type d'OS ainsi que la version et le chemin de l’interpréteur Python utilisé.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
#! /usr/bin/env PYTHON
# -*- coding: utf-8 -*-
import
os
import
sys
import
platform
version =
platform.python_version_tuple
(
)
print
(
"OS de type:
%s
"
%
(
os.name))
print
(
"Python Version
%s
.
%s
.
%s
"
%
(
version[0
], version[1
], version[2
]))
print
(
"chemin python:
%s
"
%
(
sys.executable))
Nous allons d'abord l’exécuter sur l'OS directement, puis nous activerons la virtualenv, et nous le lancerons à nouveau.
Comme nous pouvons le constater, exécutée directement sur notre système, c'est la version par défaut de Python du système, Python 2.7, qui est utilisée, depuis /usr/bin.
Une fois dans notre virtualenv, le même script nous indique le Python par défaut de notre virtualenv, à savoir Python 2.7, non pas depuis /usr/bin, mais depuis les dossiers de notre virtualenv.
Nous sommes ainsi entièrement isolés par rapport à notre installation locale.
La dernière commande lancée vous montre comment faire pour lancer votre logiciel à l'intérieur d'une virtualenv.
VI-D. Copie et déploiement de virtualenv▲
Rendu à ce niveau, vous vous demandez peut-être, si au-delà du test/développement, cela peut également servir au déploiement. Eh bien la réponse est : oui.
Tout commence lors de votre développement. Vous devez vous créer une virtualenv fonctionnelle pour votre logiciel.
Une fois votre développement terminé, il faudra évidemment que les utilisateurs finals disposent du même environnement (branche de Python, paquets…) afin que votre code fonctionne.
Partons du principe que vous voulez livrer une virtualenv. Vous disposez déjà de la procédure pour en créer une. Il vous manque cependant la façon de faciliter le déploiement des paquets tiers.
Nous allons utiliser ici l'outil pip. Cela impose qu'il soit installé dans la virtualenv.
Nous allons commencer par lister les paquets installés au sein de la virtualenv. La procédure suivante va vous créer un fichier contenant tous les paquets installés, ainsi que leurs versions respectives, dans votre virtualenv.
Si nous utilisons cette procédure, ici, dans le cadre des virtualenvs, cela fonctionne également pour une installation locale standard.
pip freeze >
/
home/
alex/
test/
requirements.txt
Comme on peut le voir, mon installation ne contient qu'un paquet tiers : coverage, qui permet de mesurer la couverture de code (voir cet articlehttp://deusyss.developpez.com/tutoriels/Python/Coverage/).
Vous n’êtes pas obligé de stipuler un numéro de version. Vous auriez ainsi pu lire juste « coverage » au lieu de « coverage==3.7.1 ». La dernière version disponible serait alors systématiquement téléchargée.
Cependant, pour des raisons évidentes de stabilité, il est préférable de toujours stipuler un numéro de version.
Nous allons maintenant réutiliser ce fichier.
Tout d'abord, créons une nouvelle virtualenv, en ne copiant que les paquets Python.
Nous n'avons pas utilisé l'option --system-site-packages et pouvons constater que la commande pip freeze ne renvoie que deux paquets.
Bien, maintenant, utilisons notre fichier de listing.
pip install -
r requirements.txt
On peut constater que malgré quelques erreurs, le paquet est installé avec succès et apparaît bien si on effectue la commande pip freeze.
De même, si vous lancez une console Python, au sein de votre virtualenv, vous pourrez importer le module coverage.
Cette méthode utilise Pypi. Pour que cela fonctionne, il faut donc disposer d'un accès Internet. De plus, si vous stipulez dans votre fichier de requirements un paquet non disponible pour la branche Python dont vous disposez dans la virtualenv, ou un numéro de version erroné, alors l'installation échouera.
VII. Conclusion▲
Comme nous venons de voir ensemble, les virtualenvs, bien que peu répandues, peuvent se révéler très utiles. Par exemple, tester un nouveau module sans compromettre notre installation locale, travailler sur plusieurs projets utilisant des modules incompatibles entre eux… Les exemples de cas d'application ne manquent pas.
Très utilisé en milieu professionnel pour des raisons évidentes de compartimentage, c'est un outil qui se révélera à vous comme des plus pratiques, aussi bien pour de simples tests que pour vos futurs développements.