Comment mettre à jour un environnement Conda existant avec un fichier .yml

139

Comment un environnement conda préexistant peut-il être mis à jour avec un autre fichier .yml. Ceci est extrêmement utile lorsque vous travaillez sur des projets qui ont plusieurs fichiers d'exigences, c'est base.yml, local.yml, production.yml-à- dire , etc.

Par exemple, vous trouverez ci-dessous un base.ymlfichier contenant les packages conda-forge, conda et pip:

base.yml

name: myenv
channels:
  - conda-forge
dependencies:
  - django=1.10.5
  - pip:
    - django-crispy-forms==1.6.1

L'environnement réel est créé avec: conda env create -f base.yml.

Plus tard, des packages supplémentaires devront être ajoutés base.yml. Un autre fichier, par exemple local.yml, doit importer ces mises à jour.

Les tentatives précédentes pour accomplir ceci incluent:

création d'un local.ymlfichier avec une définition d'importation:

channels:

dependencies:
  - pip:
    - boto3==1.4.4
imports:
  - requirements/base. 

Et puis exécutez la commande suivante : conda install -f local.yml.

Cela ne fonctionne pas. Des pensées?

tilikoom
la source
Est-il possible de mettre à jour l'environnement actuellement activé ?? J'ai juste essayé ceci mais la mise à jour est allée à l'environnement nommé dans le fichier yml.
Sören

Réponses:

203

Essayez d'utiliser la mise à jour de conda env :

conda activate myenv
conda env update --file local.yml

Ou sans avoir besoin d'activer l'environnement (merci @NumesSanguis):

conda env update --name myenv --file local.yml
alcamide
la source
12
Vous n'avez pas besoin du signe égal entre -fet file.yml. La suppression du signe égal fera fonctionner la complétion de tabulation sur le .ymlnom de fichier.
BallpointBen
4
Ajoutez --name env_namepour ignorer toute name: foobalise dans local.yml. Empêche également la nécessité d'activer myenv en premier. Commande complète: conda env update --name env_name --file local.yml De: stackoverflow.com/a/45525593/3399066 Commentaire de
NumesSanguis
1
Dans la version la plus récente de conda, je pense que nous utilisons "conda activate myenv" au lieu de "source activate myenv"
teter123f
32

La réponse suggérée est partiellement correcte. Vous devrez ajouter l' option --prune pour désinstaller également les packages qui ont été supprimés de l'environnement.yml. Commande correcte:

conda env update -f local.yml --prune
Cligner
la source
Même l' indicateur --prune ne suffit pas pour supprimer les dépendances installées de pip ...
Jean Paul
Vrai. Je pense que cela supprimera les dépendances conda mais pas celles répertoriées sous pip
Blink
22

La réponse d'alkamid est sur les bonnes lignes, mais j'ai trouvé que Conda ne parvient pas à installer de nouvelles dépendances si l'environnement est déjà actif. La désactivation de l'environnement résout d'abord ce problème:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Dave
la source
4
Comment conda sait-il quel environnement mettre à jour s'il n'est pas actuellement actif?
Thomas Fauskanger
5
@ThomasFauskanger, vous pouvez le spécifier explicitement avec -n <environment name>, mais par défaut, il semble fonctionner avec l'environnement attendu (peut-être le plus récemment actif, ou simplement un choix d'environnement par défaut)
Dave
18
@ThomasFauskanger Le nom de l'environnement est spécifié dans le fichier YAML s'il a été exporté par conda.
Thomas
Je pensais que l'ancien point de cette question était de mettre à jour un environnement différent de celui spécifié dans le fichier yaml.
Giacomo
1
@ThomasFauskanger le fichier yaml comprend le nom de l'environnement
Abdulrahman Bres