Skip to content

(mise + uv) au lieu de (conda + pip)

propos

est-ce que conda c’est le top ?

conda existe depuis très longtemps; c’est un avantage car il est très utilisé et donc bien connu, et relativement stable également
toutefois son âge commence à se faire sentir, et le développeur exigeant peut avoir envie d’utiliser des outils plus modernes qui auraient moins d’inconvénients

quels inconvénients me direz-vous ? le principal est sans aucun doute la lenteur !
la création d’un environnement virtuel avec conda est une opération très lourde, du coup on prend facilement l’habitude .. de le faire le moins possible; or il se trouve qu’il existe à présent des alternatives beaucoup plus efficaces pour cela, et c’est le but ici

et pip alors ?

c’est un peu la même histoire avec pip, il existe aujourd’hui des alternatives qui rendent en gros le même service, mais qui sont beaucoup plus efficaces

remplacer conda par mise

à quoi nous sert conda finalement ?
essentiellement pour ce qui nous concerne, on s’en sert pour créer des environnements virtuels dans lesquels on peut mettre, par exemple python-3.13, ou node-24

mise est un outil écrit en Rust, très rapide et moderne, qui permet de gérer les versions d’outils et de langages de programmation. Il remplace avantageusement conda pour installer différentes versions des langages de développement les plus répandus.

la logique consiste à pouvoir dire par exemple

dans le dossier /un/dossier (et ses descendants), si je tape python ça veut dire la version 3.14 et si je tape node ça veut dire la version 24

et bien sûr on peut faire ça dans autant de dossiers qu’on veut
de cette façon, il suffit de changer de dossier pour changer de version !

pas tout à fait ça
en pratique on n’obtient ce comportement qu’après avoir aussi installé direnv; mais bon c’est l’idée générale tout de même

et uv pour remplacer pip ?

uv quant à lui est spécifique à Python, il s’agit d’un gestionnaire de paquets Python ultra-rapide, écrit également en Rust; il offre une alternative beaucoup plus efficace à pip tout en restant compatible avec l’écosystème Python existant

essentiellement uv va créer un environnement virtuel qui est associé, lui aussi, au dossier courant

pour les installer

mise

on installe
  1. installer le runtime Visual C++
    Terminal window
    # download the installer
    curl -L -O https://aka.ms/vc14/vc_redist.x64.exe
    # execute the installer
    ./vc_redist.x64.exe
  2. installer mise
    Terminal window
    winget install jdx.mise
  3. activer au démarrage du terminal
    par défaut mise ne supporte pas le combo bash+Windows, on va l’aider un peu
    Terminal window
    curl -k https://intro.info-mines.paris/code/setup-mise.sh | bash
on vérifie mise (tous OS)

comme d’hab: n’oubliez pas de relancer un nouveau terminal

Terminal window
mise --version

uv

on installe
Terminal window
curl -LsSf https://astral.sh/uv/install.sh | sh
on vérifie uv (tous OS)

comme d’hab: n’oubliez pas de relancer un nouveau terminal

Terminal window
uv --version

un exemple

<tl;dr>

voyez la version longue ci-dessous, mais pour faire court:

Terminal window
mkdir monprojet
cd monprojet
mise use python@3.14
uv init
uv add numpy
source .venv/bin/activate
# et là tout baigne
python --version
python -c "import numpy; print(numpy.__version__)"
choisir ses versions: `mise use`

mise use

mise va

  • automatiquement installer les différents langages si besoin; il va les télécharger s’ils ne sont pas déjà sur la machine
  • créer un fichier mise.toml pour mémoriser ça
Terminal window
# on déclare qu'on a besoin de python-3.14
mise use python@3.14
# ce serait pareil pour node
mise use node@24

pour voir où on en est

Terminal window
# optionnel: confirmer qu'on a bien maintenant la bonne version
python --version
# pour confirmer
node --version
# cette commande est très intéressante pour lister les différentes versions
# déjà connues, et quelle sont celles en vigueur dans ce dossier
mise ls
# ou encore pour un langae donné
mise ls python
les dépendances: `uv add`

uv add

au moins une fois il faut faire ceci; qui va - entre autres - créer le fichier pyproject.toml pour y ranger notamment les dépendances Python

Terminal window
uv init
à quoi sert pyproject.toml ?

bon à savoir, ce fichier est également central pour le “packaging” de votre projet Python, donc c’est tout bénéf:)
notamment, puisque vous avez besoin de numpy, c’est sans doute qu’il faudra l’installer aussi pour les gens qui voudront ensuite utiliser votre code; autant ranger cette information quelque part…

une fois que c’est fait, avec la phrase suivante on va:

  • downloader les librairies, toujours si nécessaire i.e. seulement la première fois
  • les ajouter dans pyproject.toml
Terminal window
# déclarer les dépendances
uv add numpy pandas matplotlib
que mettre dans le repo git ?

avec git

à ce stade il est recommandé de mettre dans le repo git:

  • mise.toml
  • pyproject.toml
et pour l'utiliser ?

mise install + uv sync

de cette façon, si quelqu’un clone le repo git, voici comment il pourra mettre en place son environnement de dév:

Terminal window
git clone ..../monprojet.git
cd monprojet
# pour installer localement le bon python
mise install
# pour créer le venv avec les dépendances
uv sync
# ne pas oublier d'activer
source .venv/bin/activate
# et là on a installé numpy

le prompt

comme avec conda, il est crucial d’avoir un prompt qui indique l’environnement actif; si nécessaire

voyez ici la section sur le prompt starship

si vous voulez creuser

activate automatique ?

un autre inconvénient avec conda, c’est la nécessité de faire explicitement le conda activate qui va bien, comme on l’a vu avec uv cette contrainte persiste

il existe une alternative, direnv, qui permet d’automatiser l’activation de l’environnement; ça demande un peu de setup initial, mais le retour sur investissement est rapide !

l’idée consiste à faire en sorte que l’activation soit déclenchée par un simple changement de dossier courant (un cd, quoi)

auto-activate avec direnv
  1. installer direnv
    Terminal window
    # macOS
    brew install direnv
    # Linux (Debian/Ubuntu)
    sudo apt install direnv
    # Windows (avec scoop)
    winget install direnv.direnv
  2. dans chaque projet où vous voulez l’utiliser, créer un fichier .envrc avec le contenu suivant
    Terminal window
    echo 'eval "$(mise hook direnv)"' > .envrc
  3. puis, toujours dans chaque projet
    Terminal window
    direnv allow

config globale / projets imbriqués ?

pour définir le comportement de la commande python en dehors des espaces mise, l’idée de faire un mise use dans son homedir n’est pas la bonne idée (voir les détails sordides ci-dessous)
au contraire il faut faire plus simplement

Terminal window
mise use -g python@3.14
Attention aux espaces imbriqués !

avec git on peut facilement imbriquer les repos; pour savoir dans quel repo on est, git remonte dans le filesystem et s’arrête dès qu’il a trouvé un dossier .git

on pourrait être tenté de faire la même chose avec mise, mais malheureusement mise ne fonctionne pas comme ça !
en pratique ça signifie qu’il faut configurer ses espaces mise comme des dossiers séparés, et ne pas en inclure un sous un autre

références

influences

voyez aussi ces différents outils qui ont certains comportements avec ceux-ci

  • npm pour l’idée d’installer les dépendances tout en les mémorisant dans package.json
  • venv qui est utilisé en sous-main par uv pour les environnements virtuels Python (et qui n’existait pas à l’époque de conda)