Environnements Python sous Win-x64

Par défaut on pourrait utiliser l’environnement (base) mais c’est une mauvaise idée si on charge trop l’installation par des paquetages binaires issus de canaux différents (plus les outils scientifiques qui y sont associés de manière externe). Au bout d’un moment il va y avoir des dépendances croisées l’environnement de base et le système peut produire des erreur, par exemple l’erreur setuptools qui se produisait avec miniconda3 :

Minconda - setuptools problem

python - RemoveError: ‘setuptools’ (ou autre, ex: pluggy) is a dependency of conda and cannot be removed from conda’s operating environment - Stack Overflow
The dependency problems you are having are a result of having conda-forge packages installed in your ‘base’ environment. conda-forge has bleeding edge packages, whereas the conda packages installed by default in the base environment are stable versions of those packages .
You should install conda-forge packages into a separate conda environment to get avoid this kind of problem:

conda create-n cforgeenv
conda activate cforgeenv
conda install pyopenssl

Donc il ne faut pas toucher à (base) mais travailler sur un autre environnement, par exemple (prod) qui inclura les paquetages issus des canaux (ex: source-forge) utilisés pour les codes métier. Mais tout d’abord il faut avoir quelques bases pour manipuler les environnements.

Article mis à jour en Janvier 2025.

Navigation dans le guide

Guide [ Installation de Python sous Win-x64 ]




1. Conda ou mamba

On peut utiliser conda ou mamba pour ce type d’opérations, pour mémoire les options conda et mamba :

conda mamba
activate Activate a conda environment.
clean Remove unused packages and caches.
commands List all available conda subcommands (including those from plugins). Generally only used by tab-completion.
compare Compare packages between conda environments.
config Modify configuration values in .condarc.
create Create a new conda environment from a list of specified packages.
deactivate Deactivate the current active conda environment.
doctor Display a health report for your environment.
export Export a given environment
info Display information about current conda install.
init Initialize conda for shell interaction.
install Install a list of packages into a specified conda environment.
list List installed packages in a conda environment.
notices Retrieve latest channel notifications.
package Create low-level conda packages. (EXPERIMENTAL)
remove (uninstall) Remove a list of packages from a specified conda environment.
rename Rename an existing environment.
repoquery Advanced search for repodata.
run Run an executable in a conda environment.
search Search for packages and display associated information using the MatchSpec format.
update (upgrade) Update conda packages to the latest compatible version.
activate Activate an environment
auth Login or logout of a given host
clean Clean package cache
config Configuration of micromamba
constructor Commands to support using micromamba in constructor
create Create new environment
env See mamba/micromamba env --help
info Information about micromamba
install Install packages in active environment
list List packages in active environment
package Extract a package or bundle files into an archive
ps Show, inspect or kill running processes
remove, uninstall Remove packages from active environment
repoquery Find and analyze packages in active environment or channels
run Run an executable in an environment
search Find packages in active environment or channels. This is equivalent to repoquery search command
self-update Update micromamba
shell Generate shell init scripts
update Update packages in active environment

Nous constatons que la plupart des commandes sont similaires, mais qu’il n’y a pas équivalence totale entre les deux outils, dans la suite de l’article j’utilise des exemples conda. Je préfère utiliser conda pour les environnements et mamba pour les paquetages, les commandes conda à retenir sont :

Commande Action
export Export a given environment
list List the Conda environments
remove Remove an environment
update Update the current environment based on environment file
config Configure a conda environment

Nb: On peut obtenir de l’aide par conda <commande> --help.

2. Sortie d’un environnement

Comme sur Linux, on sort de l’environnement par conda deactivate, la commande config permet de ne pas utiliser l’environnement (base) par défaut.

3. Installation ciblée d’un paquetage

En cas de plusieurs environnements, il est possible de cibler l’installation d’un paquetage vers un environnement donné, éventuellement vers un canal donné (option -c), par exemple Six :

4. Lister et supprimer un environnement

Par exemple l’environnement (bp10) qui est installé dans un répertoire utilisateur c:\Users\Xxx. Une option qui n’est pas choisie, sous Windows, on pourra installer les environnements utilisateurs dans la racine de Python3, sinon bonjour les changements de dossiers dans le terminal.

C:\Local>conda env list
# conda environments:
#
base C:\Python3
bp10 C:\Users\Xxx\.conda\envs\bp10C:\Local>conda env remove --name bp10
Remove all packages in environment C:\Users\Xxx\.conda\envs\bp10:
Everything found within the environment (C:\Users\Xxx\.conda\envs\bp10), including any conda environment configurations and any non-conda files, will be deleted. Do you wish to continue?
(y/[n])? y

Effectivement les fichiers ont bien disparu du répertoire C:\Users\Cob\.conda\envs\.

5. Création d’un environnement (mode all users)

Pour l’exemple, on part d’une installation de Miniconda dans c:\Python3 avec une version Python 3.12.
Pour créer un environnement Python 3.10 on utilise la commande conda create et la sous-version de Python qui va être utilisée, par exemple :

conda create --name bp10 python=3.10
Channels:
- defaults
Platform: win-64
Collecting package metadata (repodata.json): done
Solving environment: done## Package Plan ##
  environment location: C:\Users\Cob\.conda\envs\bp10
  added / updated specs:
     - python=3.10The following packages will be downloaded:
   package                    |            build
   ---------------------------|-----------------
   bzip2-1.0.8                |       h2bbff1b_6           90 KB
   ca-certificates-2024.3.11  |       haa95532_0          128 KB
   libffi-3.4.4               |       hd77b12b_1          122 KB
   ...
   wheel-0.43.0               |  py310haa95532_0          136 KB
   xz-5.4.6                   |       h8cc25b3_1          609 KB
   zlib-1.2.13                |       h8cc25b3_1          131 KB
   ------------------------------------------------------------
                                          Total:         34.1 MBThe following NEW packages will be INSTALLED:
  bzip2            pkgs/main/win-64::bzip2-1.0.8-h2bbff1b_6
  ca-certificates  pkgs/main/win-64::ca-certificates-2024.3.11-haa95532_0
  ...
  xz               pkgs/main/win-64::xz-5.4.6-h8cc25b3_1
  zlib             pkgs/main/win-64::zlib-1.2.13-h8cc25b3_1Proceed ([y]/n)? y
Downloading and Extracting Packages:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
#     $ conda activate bp10
## To deactivate an active environment, use
#     $ conda deactivate

Conda installe un certain nombre de paquetages, ce n’est pas les mêmes que sous Ubuntu, par exemple ncurses n’est pas installé. L’environnement bp10 est installé dans C:\Users\Xxx\.conda\envs\bp10 et pèse 374 Mo contre 293 Mo pour c:\Python3 ! Il contient une version fonctionnelle de Python 3.10 (qui peut être aussi une sous-version différente du Python de l’environnement base):

(base) C:\Local>conda deactivate
C:\Local>conda activate bp10
(bp10) C:\Local>python -V
Python 3.10.14

6. Création d’un environnement (mode current user)

Dans ce cas, les choses sont plus simples, à partir de (base) on crée (prod) dans la même version de Python.

(base) C:\Users\Xxx>conda create -n prod
Channels:
- defaults
Platform: win-64
Collecting package metadata (repodata.json): done
Solving environment: done
## Package Plan ##
environment location: C:\Python3\envs\prod
Proceed ([y]/n)? y

Preparing transaction: done
Verifying transaction: done
Executing transaction: done
#
# To activate this environment, use
# $ conda activate prod
# To deactivate an active environment, use
# $ conda deactivate

Le fichier .condarc est présent dans C:\users\Xxx. Un répertoire .conda est créé dans C:\users\Xxx , il ne contient que deux fichiers : aau_token et environments.txt. Un répertoire C:\Python3\envs est créé (quelques Ko) et contient les répertoires etc et conda-meta quasi vides.

Le problème est qu’avec cette méthode (qui parait logique pourtant) l’environnement créé est vide et inutilisable, il n’y a pas de paquetages créés dans (prod) même si on peut l’activer ou le désactiver.

7. Clonage d’un environnement

La méthode est très simple, par exemple pour l’environnement (base) :

8. Utilisation d’un fichier de spécifications

On peut le construire avec une liste explicite de fichiers, que l’on peut intermédiairement modifier.
Dans les deux cas, l’architecture et les versions doivent être identiques dans la source et la destination.

C’est une bonne méthode si on utilise un fichier de spécifications généré sur un ordinateur et que l’on veut installer le même environnement sur une autre machine (OS et architectures comparables).

9. Problématiques liées à l’utilisation de Conda et Pip

Par exemple, clonons (base) pour générer un environnement (bp1) :

(base) C:\Local>conda create --name bp1 --clone base
Source: C:\Python3
Destination: C:\Python3\envs\bp1
The following packages cannot be cloned out of the root environment:
- defaults/win-64::conda-24.5.0-py310haa95532_0
- defaults/win-64::anaconda-anon-usage-0.4.4-py310hfc23b7f_100
- defaults/noarch::conda-libmamba-solver-24.1.0-pyhd3eb1b0_0
Packages: 64
Files: 5
Downloading and Extracting Packages:
Downloading and Extracting Packages:
Preparing transaction: done
...

Cette fois (bp1) fait 298 Mo, et on retrouve toute une arborescence Python dans c:\Python3\envs\bp10 et Python est fonctionnel. Si on installe (pip ou conda) des paquetages (ex: six ou pyparsing) dans l’environnement (base) ils ne seront pas inclus dans l’environnement (bp1), il faudra faire des mises à jour (conda update), donc:

Avant de créer l’environnement (prod) par clonage, il faut partir d’un environnement (base) assez complet, ou travailler avec des fichiers de spécification.

En plus, la question se pose sur l’enchainement des sources d’installations, conda et pip, les canaux d’installation : pkgs/main, conda-forge … Les recommandations sont :

Order Use pip only after conda.
Install as many requirements as possible with conda then use pip.
Once pip has been used, conda will be unaware of the changes.
To install additional conda packages, it is best to recreate the environment.
Pip use Pip should be run with –upgrade-strategy only-if-needed (the default).
Do not use pip with the –user argument, avoid all users installs.
Isolation Create a conda environment to isolate any changes pip makes.
Care should be taken to avoid running pip in the root environment.
Recreate the environment if changes are needed.
Tool Store conda and pip requirements in text files.
Package requirements can be passed to conda via the –file argument.
Pip accepts a list of Python packages with -r or –requirements.
Conda env will export or create environments based on a file with conda and pip requirements.

Issues may arise when using pip and conda together. When combining conda and pip, it is best to use an isolated conda environment. Only after conda has been used to install as many packages as possible should pip be used to install any remaining software. If modifications are needed to the environment, it is best to create a new environment rather than running conda after pip. When appropriate, conda and pip requirements should be stored in text files.

Dans mon cas, j’évite pip autant que possible et je fais très attention à l’ordre dans lequel j’installe les paquetages, dans l’idéal il faudrait :

  • Installer (base) avec les paquetages conda des canaux pkgs/main/noarch, pkgs/main; puis ne plus y toucher et faire un (clone1).
  • Utiliser (clone1) avec les paquetages conda-forge et les autres canaux conda si nécessaire; puis éventuellement le cloner s’il y a des risques, par exemple des paquetages trop expérimentaux (clone2).
  • Il faudra finir autant que possible avec les paquetages pip sur un environnement stable sans problèmes de dépendances croisées.

10. Mises à jour des environnements

Une fois que Python est fonctionnel dans les environnements ont peut les mettre à jour. Par exemple dans (base) :

(base) C:\Local>conda update -n base -c defaults conda
Retrieving notices: ...working... done
Channels:
  - defaults
Platform: win-64
Collecting package metadata (repodata.json): done
Solving environment: done
# All requested packages already installed.

Mais aussi vers un autre environnement, à condition que conda soit installé :

(base) C:\Local>conda install -n bp1 conda
Channels:
  - defaults
Platform: win-64
Collecting package metadata (repodata.json): done
Solving environment: done
## Package Plan ##
  environment location: C:\Python3\envs\bp1
  added / updated specs:
      - conda
The following NEW packages will be INSTALLED:
  conda                 pkgs/main/win-64::conda-24.5.0-py310haa95532_0
  conda-libmamba-so~    pkgs/main/noarch::conda-libmamba-solver-24.1.0-pyhd3eb1b0_0
Proceed ([y]/n)? y
Downloading and Extracting Packages:
...
Executing transaction: done

Dans ce cas on peut faire la mise à jour :

(base) C:\Local>conda deactivate
C:\Local>conda activate bp1
(bp1) C:\Local>conda update -c defaults conda
Channels:
  - defaults
Platform: win-64
Collecting package metadata (repodata.json): done
Solving environment: done
# All requested packages already installed.

Donc nous constatons d’une certaine manière que le clonage n’a pas ‘cloné’ conda.

Cas de plusieurs canaux
Pour mettre à jour Miniconda, il faut faire attention de spécifier le canal, surtout si on a une priorité plus élevée sur conda-forge (qui servira surtout pour les paquetages Python).  En principe -defaults devrait être est en avance sur conda-forge, donc commencer par mettre à jour le canal defaults :

En mode ‘All users’ il faut utiliser un CLI avec les droits administrateur pour faire la mise à jour.

Il n’est pas nécessaire de lancer un environnement Python pour réaliser ce type de mise à jour.

Retour en haut