Como atualizar um ambiente Conda existente com um arquivo .yml


136

Como um ambiente conda pré-existente pode ser atualizado com outro arquivo .yml. Isso é extremamente útil ao trabalhar em projetos que possuem vários arquivos de requisitos, ou seja base.yml, local.yml, production.yml, etc.

Por exemplo, abaixo está um base.ymlarquivo com pacotes conda-forge, conda e pip:

base.yml

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

O ambiente real é criado com: conda env create -f base.yml.

Posteriormente, pacotes adicionais precisam ser adicionados ao base.yml. Outro arquivo, por exemplo local.yml, precisa importar essas atualizações.

Tentativas anteriores para fazer isso incluem:

criando um local.ymlarquivo com uma definição de importação:

channels:

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

E depois executar o comando: conda install -f local.yml.

Isso não funciona. Alguma ideia?


É possível atualizar o ambiente atualmente ativado? Eu apenas tentei isso, mas a atualização foi para o ambiente nomeado no arquivo yml.
Sören

Respostas:


201

Tente usar o conda env update :

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

Ou sem a necessidade de ativar o ambiente (obrigado @NumesSanguis):

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

12
Você não precisa do sinal de igual entre -fe file.yml. A remoção do sinal de igual fará com que a conclusão da guia funcione no .ymlnome do arquivo.
BallpointBen

4
Adicione --name env_namepara ignorar qualquer name: footag em local.yml. Também evita a necessidade de ativar o myenv primeiro. Comando completo: conda env update --name env_name --file local.yml De: comentário de stackoverflow.com/a/45525593/3399066
NumesSanguis 15/11/19

1
Na versão mais recente do conda, acho que usamos "conda enable myenv" em vez de "source enable myenv"
teter123f

31

A resposta sugerida está parcialmente correta. Você precisará adicionar a opção --prune para desinstalar também os pacotes que foram removidos do environment.yml. Comando correto:

conda env update -f local.yml --prune

Mesmo o sinalizador --prune não é suficiente para remover as dependências instaladas pelo pip ...
Jean Paul

Verdade. Eu acho que ele irá remover as dependências conda, mas não as listadas em pip
Blink

22

A resposta da alkamid está nas linhas corretas, mas descobri que a Conda falha ao instalar novas dependências se o ambiente já estiver ativo. Desativar o ambiente primeiro resolve isso:

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

4
Como a conda sabe qual ambiente atualizar se não é a atual no momento?
Thomas Fauskanger

5
@ThomasFauskanger você pode especificá-lo explicitamente com -n <environment name>, mas por padrão, ele parece funcionar com o ambiente esperado (talvez o mais ativo recentemente, ou apenas uma escolha ambiente padrão)
Dave

18
@ThomasFauskanger O nome do ambiente é especificado no arquivo YAML se tiver sido exportado pela conda.
Thomas

Eu pensei que o ponto antigo desta pergunta é atualizar um ambiente diferente daquele especificado no arquivo yaml.
Giacomo

1
@ThomasFauskanger o arquivo yaml inclui o nome do ambiente #
Abdulrahman Bres
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.