Cómo actualizar un entorno Conda existente con un archivo .yml

138

¿Cómo se puede actualizar un entorno conda preexistente con otro archivo .yml? Esto es extremadamente útil cuando se trabaja en proyectos que tienen múltiples archivos de requisitos, es decir base.yml, local.yml, production.yml, etc.

Por ejemplo, a continuación se muestra un base.ymlarchivo con paquetes conda-forge, conda y pip:

base.yml

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

El entorno actual se crea con: conda env create -f base.yml.

Más adelante, se deben agregar paquetes adicionales base.yml. Otro archivo, por ejemplo local.yml, necesita importar esas actualizaciones.

Los intentos anteriores para lograr esto incluyen:

crear un local.ymlarchivo con una definición de importación:

channels:

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

Y a continuación, ejecute el comando: conda install -f local.yml.

Esto no funciona. ¿Alguna idea?

tilikoom
fuente
¿Es posible actualizar el entorno actualmente activado? Acabo de intentar esto, pero la actualización fue al entorno nombrado en el archivo yml.
Sören

Respuestas:

202

Intente usar la actualización de conda env :

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

O sin la necesidad de activar el entorno (gracias @NumesSanguis):

conda env update --name myenv --file local.yml
alcamida
fuente
12
No necesita el signo igual entre -fy file.yml. Eliminar el signo igual hará que la finalización de la pestaña funcione en el .ymlnombre del archivo.
BallpointBen
44
Agregar --name env_namepara ignorar cualquier name: fooetiqueta local.yml. También evita la necesidad de activar myenv primero. Comando completo: conda env update --name env_name --file local.yml De: stackoverflow.com/a/45525593/3399066 comentario de
NumesSanguis
1
En la versión más reciente de conda creo que usamos "conda enable myenv" en lugar de "source generate myenv"
teter123f
31

La respuesta sugerida es parcialmente correcta. Deberá agregar la opción --prune para desinstalar también los paquetes que se eliminaron del environment.yml. Comando correcto:

conda env update -f local.yml --prune
Parpadeo
fuente
Incluso la bandera --prune no es suficiente para eliminar las dependencias instaladas pip ...
Jean Paul
Cierto. Creo que eliminará las dependencias de conda, pero no las enumeradas en pip
Parpadeo
22

La respuesta de alkamid está en la línea correcta, pero descubrí que Conda no puede instalar nuevas dependencias si el entorno ya está activo. La desactivación del entorno primero resuelve esto:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Dave
fuente
44
¿Cómo sabe conda qué env actualizar si no es el actualmente activo?
Thomas Fauskanger
55
@ThomasFauskanger puede especificarlo explícitamente -n <environment name>, pero de manera predeterminada parece funcionar con el entorno esperado (tal vez la opción activa más reciente, o simplemente una opción de entorno predeterminada)
Dave
18
@ThomasFauskanger El nombre del entorno se especifica en el archivo YAML si ha sido exportado por conda.
Thomas
Pensé que el viejo punto de esta pregunta es actualizar un entorno diferente al especificado en el archivo yaml.
Giacomo
1
@ThomasFauskanger el archivo yaml incluye el nombre del entorno
Abdulrahman Bres