Autour du codeDevelopper toujours mieux
Posté le

Venv, le nouveau Virtualenv

Virtualenv est un outil qui permet de gérer plusieurs environnements python isolés les uns des autres.

Chaque environnement possède donc ses propres packages et vous pouvez également avoir des versions de python différentes d'un environnement à l'autre.

La PEP 405 a proposé d'intégrer ce mécanisme dans python et ce fut chose faites dans Python 3.3 avec l'intégration du module venv. Voici comment ça marche: Imaginons que l'on doit faire un site web sur M. Michu en utilisant Django et une application web pour la commande de sushi en utilisant Tornado. On va d'abord créer deux environnements en utilisant la commande python3 -m venv

$ python3 -m venv michuWebSite

$ python3 -m venv sushiWebSite

Ensuite on active l'environnement avec lequel on veux travailler. en utilisant un des script créé dans <votre venv>/bin. Activate pour bash, activate.bat sous windows ou Activate.ps1 si vous utilisez PowerShell.

$ source sushiWebSite/bin/activate

On peut ensuite utiliser pip pour installer les dépendances du projet. Si vous êtes sous python 3.3 et que votre installation cotoie une python 2.7 un problème peu se poser

$ pip install tornado

Downloading/unpacking tornado
  Downloading tornado-4.0.1.tar.gz (314kB): 314kB downloaded
  Running setup.py egg_info for package tornado
...
creating /usr/lib64/python2.7/site-packages/tornado
error: could not create '/usr/lib64/python2.7/site-packages/tornado': Permission denied

C'est le pip de python 2.7 qui est appelé pas celui de notre venv. On va donc installer pip dans notre venv. Pour ce faire, on va télécharger le script get-pip.py

$ curl https://raw.githubusercontent.com/pypa/pip/master/contrib/get-pip.py > get-pip.py

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1309k  100 1309k    0     0   779k      0  0:00:01  0:00:01 --:--:--  779k

Puis l'installer et créer un wrapper dans <venv>/bin/

(sushiWebSite) $ python get-pip.py

Downloading/unpacking pip
...
Cleaning up...
(sushiWebSite) [maillol@new-host ~]$ echo 'python -m pip "$@"' > sushiWebSite/bin/pip

On sort de notre venv en utilisant deactivate puis on le réactive.

(sushiWebSite) $ deactivate

$ source sushiWebSite/bin/activate

Maintenant pas de problème pour installer tornado.

(sushiWebSite) $ pip install tornado

Downloading/unpacking tornado
...
Successfully installed tornado certifi
Cleaning up...

Tornado est donc bien installé dans ce venv uniquement celui-ci.

(sushiWebSite) $ python -c 'import tornado'

Si l'on change de venv tornado ne si trouve plus.

(sushiWebSite) $ deactivate

$ source michuWebSite/bin/activate

(michuWebSite) $ python -c 'import tornado'

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named 'tornado'

Notez que la version 3.4 de python intègre pip, donc vous n'aurez pas à l'installer. Autre chose, vous n'etez pas obliger de mettre le code de votre projet dans votre venv vous pouvez très bien avoir un répertoire dans lequel vous géré tout vos venv et votre workspace avec vos source python à coté, ça peut être pratique si deux projets doivent tourner sur le même venv

Allez à vos IDE et bon code! smile