Introduction
L'utilisation de langages comme Python ou Node.js, où les modules tiers sont nombreux et souvent mis à jour, peut devenir complexe: différents projets peuvent nécessiter des versions différentes, parfois incompatibles entre elles ou avec celles installées sur le système.
Avec Python, pip permet d'installer des paquets pour l'utilisateur avec --user
, mais cela ne fonctionne que pour une seule version. Pour éviter ces problèmes, il existe plusieurs outils, dont le plus connu est virtualenv
, qui permet de gérer des environnements isolés.
Le module virtualenv
crée une arborescence python
dédiée à un projet, dans un dossier donné en argument. Une fois créé, un script fourni permet alors de l'utiliser: Toutes les commandes relatives à python se réfèrent alors à cet environnement.
Création de l'environnement et usage
Dans notre dossier demo
, on va installer l'environnement virtuel dans le dossier venv
[dev] $ mkdir demo && cd demo
[demo] $ virtualenv -p python3 venv
created virtual environment CPython3.9.21.final.0-64 in 276ms
creator CPython3Posix(dest=/Users/e.blindauer/dev/demo/venv, clear=False, no_vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/Users/e.blindauer/Library/Application Support/virtualenv)
added seed packages: pip==24.1, setuptools==70.1.1, wheel==0.41.2
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator
Pour utiliser ensuite cet environnement python, et pas celui system-wide, on source le shell script mis à disposition par le venv
:
[demo] $ source venv/bin/activate
(venv) [demo] $ pip install pandas
Collecting pandas
Using cached pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl.metadata (89 kB)
Collecting numpy>=1.22.4 (from pandas)
Using cached numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl.metadata (60 kB)
Collecting python-dateutil>=2.8.2 (from pandas)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl.metadata (8.4 kB)
Collecting pytz>=2020.1 (from pandas)
Using cached pytz-2025.1-py2.py3-none-any.whl.metadata (22 kB)
Collecting tzdata>=2022.7 (from pandas)
Using cached tzdata-2025.1-py2.py3-none-any.whl.metadata (1.4 kB)
Collecting six>=1.5 (from python-dateutil>=2.8.2->pandas)
Using cached six-1.17.0-py2.py3-none-any.whl.metadata (1.7 kB)
Using cached pandas-2.2.3-cp39-cp39-macosx_10_9_x86_64.whl (12.6 MB)
Using cached numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl (6.9 MB)
Using cached python_dateutil-2.9.0.post0-py2.py3-none-any.whl (229 kB)
Using cached pytz-2025.1-py2.py3-none-any.whl (507 kB)
Using cached tzdata-2025.1-py2.py3-none-any.whl (346 kB)
Using cached six-1.17.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: pytz, tzdata, six, numpy, python-dateutil, pandas
Successfully installed numpy-2.0.2 pandas-2.2.3 python-dateutil-2.9.0.post0 pytz-2025.1 six-1.17.0 tzdata-2025.1
[notice] A new release of pip is available: 24.1 -> 25.0.1
[notice] To update, run: pip install --upgrade pip
(venv) [demo] $ pip list
Package Version
--------------- -----------
numpy 2.0.2
pandas 2.2.3
pip 24.1
python-dateutil 2.9.0.post0
pytz 2025.1
setuptools 70.1.1
six 1.17.0
tzdata 2025.1
wheel 0.41.2
Comme vous pouvez le voir, après avoir créé un venv
, la commande pip
installe dans un dossier dédié les modules.
Si virtualenv n'est pas disponible, vous pouvez créer également avec python et le module venv:
[demo] $ python3 -m venv venv
Détails de l'activation
Le script activate
est un shell script. Il est décliné pour différents Shell au besoin: powershell
, csh
, fish
, sh
. Il va placer plusieurs variables d'environnement pour que le python utilisé soit celui du dossier venv/bin
et que les modules python soient pris dans venv/lib/python3.9/
Conclusion
En pratique, l'usage des virtualenv est facile, rapide et permet de disposer de paquets requis sans craindre des conflits avec d'autres. virtualenv
proposé ici est le plus simple, il en existe d'autres: pipenv
, pyenv
, poetry
, conda
Pour nodejs
qui utilise npm
pour installer des modules system-wide, la problématique est la même. Il existe donc nvm
ou fnm
qui permettent de gérer les versions de nodejs
! Pour des isolations , npx
ou yarn
fera le travail!