Как обновить существующую среду Conda с помощью файла .yml

139

Как можно обновить существующую среду conda другим файлом .yml. Это чрезвычайно полезно при работе над проектами, в которых есть несколько файлов требований, т. Е. И base.yml, local.yml, production.ymlт. Д.

Например, ниже представлен base.ymlфайл с пакетами conda-forge, conda и pip:

base.yml

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

Фактическая среда создается с: conda env create -f base.yml.

Позже необходимо добавить дополнительные пакеты base.yml. Скажем local.yml, другой файл должен импортировать эти обновления.

Предыдущие попытки достичь этого включают:

создание local.ymlфайла с определением импорта:

channels:

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

А затем выполнить команду: conda install -f local.yml.

Это не работает. Есть предположения?

tilikoom
источник
Можно ли обновить активированную на данный момент среду ?? Я просто попробовал это, но обновление попало в среду, указанную в файле yml.
Sören

Ответы:

203

Попробуйте использовать conda env update :

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

Или без необходимости активировать среду (спасибо @NumesSanguis):

conda env update --name myenv --file local.yml
alkamid
источник
12
Знак равенства между -fи не нужен file.yml. Удаление знака равенства заставит завершение табуляции работать с .ymlименем файла.
BallpointBen
4
Добавить, --name env_nameчтобы игнорировать любой name: fooтег в local.yml. Также предотвращает необходимость сначала активировать myenv. Полная команда: conda env update --name env_name --file local.yml От: stackoverflow.com/a/45525593/3399066 комментарий
NumesSanguis
1
В самой последней версии conda, я думаю, мы используем «conda activate myenv» вместо «source activate myenv»
teter123f
32

Предлагаемый ответ частично верен. Вам нужно будет добавить параметр --prune, чтобы также удалить пакеты, которые были удалены из environment.yml. Правильная команда:

conda env update -f local.yml --prune
Blink
источник
Даже флага --prune недостаточно для удаления установленных pip зависимостей ...
Жан Поль,
Правда. Я думаю, что он удалит зависимости conda, но не те, которые указаны в pip
Blink
22

Ответ alkamid находится в правильных строках, но я обнаружил, что Conda не может установить новые зависимости, если среда уже активна. Деактивация среды сначала решает эту проблему:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Дейв
источник
4
Как conda узнает, какой env обновлять, если он не активен в данный момент?
Thomas Fauskanger
5
@ThomasFauskanger, вы можете указать его явно -n <environment name>, но по умолчанию, похоже, он работает с ожидаемой средой (возможно, последней активной или просто выбранной средой по умолчанию)
Дэйв
18
@ThomasFauskanger Имя среды указывается в YAML-файле, если оно было экспортировано conda.
Thomas
Я думал, что старый пункт этого вопроса - обновить среду, отличную от той, которая указана в файле yaml.
Джакомо
1
@ThomasFauskanger, yaml-файл включает имя окружения
Абдулрахман Брес