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 , npxou yarn fera le travail!