Come aggiornare un ambiente Conda esistente con un file .yml


136

Come può un ambiente conda preesistente essere aggiornato con un altro file .yml. Ciò è estremamente utile quando si lavora su progetti con più file di requisiti, ad esempio base.yml, local.yml, production.yml, ecc.

Ad esempio, di seguito è riportato un base.ymlfile con pacchetti conda-forge, conda e pip:

base.yml

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

L'ambiente reale viene creato con: conda env create -f base.yml.

Successivamente, è necessario aggiungere ulteriori pacchetti a base.yml. Un altro file, ad esempio local.yml, deve importare quegli aggiornamenti.

I precedenti tentativi per ottenere questo risultato includono:

creazione di un local.ymlfile con una definizione di importazione:

channels:

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

E quindi eseguire il comando: conda install -f local.yml.

Questo non funziona. qualche idea?


È possibile aggiornare l'ambiente attualmente attivato ?? Ho appena provato questo, ma l'aggiornamento è andato all'ambiente indicato nel file yml.
Sören

Risposte:


201

Prova a utilizzare l' aggiornamento di conda env :

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

O senza la necessità di attivare l'ambiente (grazie @NumesSanguis):

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

12
Non è necessario il segno di uguale tra -fe file.yml. La rimozione del segno di uguale farà funzionare il completamento della scheda sul .ymlnome file.
BallpointBen

4
Aggiungi --name env_nameper ignorare qualsiasi name: footag in local.yml. Inoltre impedisce la necessità di attivare prima myenv. Comando completo: conda env update --name env_name --file local.yml Da: stackoverflow.com/a/45525593/3399066 's commento
NumesSanguis

1
Nella versione conda più recente penso che usiamo "conda activ myenv" invece di "source activ myenv"
teter123f

31

La risposta suggerita è parzialmente corretta. Dovrai aggiungere l' opzione --prune per disinstallare anche i pacchetti che sono stati rimossi da environment.yml. Comando corretto:

conda env update -f local.yml --prune

Anche la bandiera --prune non è sufficiente per rimuovere le dipendenze installate dal pip ...
Jean Paul

Vero. Penso che rimuoverà le dipendenze conda ma non quelle elencate sotto pip
Blink

22

La risposta di alkamid è sulla linea giusta, ma ho scoperto che Conda non riesce a installare nuove dipendenze se l'ambiente è già attivo. La disattivazione dell'ambiente risolve innanzitutto questo:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!

4
Come fa conda a sapere quale env aggiornare se non è quello attualmente attivo?
Thomas Fauskanger,

5
@ThomasFauskanger puoi specificarlo esplicitamente -n <environment name>, ma per impostazione predefinita sembra funzionare con l'ambiente previsto (forse l'ultimo attivo o solo una scelta di ambiente predefinita)
Dave

18
@ThomasFauskanger Il nome dell'ambiente è specificato nel file YAML se è stato esportato da conda.
Thomas,

Ho pensato che il vecchio punto di questa domanda fosse aggiornare un ambiente diverso da quello specificato nel file yaml.
Giacomo,

1
@ThomasFauskanger il file yaml include il nome dell'ambiente
Abdulrahman Bres
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.