Jak zaktualizować istniejące środowisko Conda za pomocą pliku .yml

138

Jak można zaktualizować istniejące środowisko Conda innym plikiem .yml. Jest to niezwykle pomocne podczas pracy nad projektami, które mają wiele plików wymagań, np. base.yml, local.yml, production.ymlItp.

Na przykład poniżej znajduje się base.ymlplik zawierający pakiety conda-forge, conda i pip:

base.yml

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

Rzeczywista środowisko jest tworzony z: conda env create -f base.yml.

Później należy dodać dodatkowe pakiety base.yml. Powiedzmy, że inny plik local.ymlmusi zaimportować te aktualizacje.

Poprzednie próby osiągnięcia tego obejmują:

tworzenie local.ymlpliku z definicją importu:

channels:

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

A następnie uruchomić komendę: conda install -f local.yml.

To nie działa. jakieś pomysły?

tilikoom
źródło
Czy można zaktualizować aktualnie aktywowane środowisko ?? Właśnie tego próbowałem, ale aktualizacja trafiła do środowiska nazwanego w pliku yml.
Sören

Odpowiedzi:

202

Spróbuj użyć aktualizacji conda env :

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

Lub bez konieczności aktywacji środowiska (dzięki @NumesSanguis):

conda env update --name myenv --file local.yml
alkamid
źródło
12
Nie potrzebujesz znaku równości między -fa file.yml. Usunięcie znaku równości spowoduje, że uzupełnianie tabulatorów będzie działać na .ymlnazwie pliku.
BallpointBen
4
Dodaj, --name env_nameaby zignorować dowolny name: footag w local.yml. Zapobiega również konieczności uprzedniej aktywacji myenv. Pełne polecenie: conda env update --name env_name --file local.yml Od: komentarz stackoverflow.com/a/45525593/3399066
NumesSanguis
1
Myślę, że w najnowszej wersji Conda używamy „conda aktywuj myenv” zamiast „źródło aktywuj myenv”
teter123f
31

Sugerowana odpowiedź jest częściowo poprawna. Będziesz musiał dodać opcję --prune , aby odinstalować również pakiety, które zostały usunięte z pliku environment.yml. Prawidłowe polecenie:

conda env update -f local.yml --prune
Migać
źródło
Nawet flaga --prune nie wystarczy, aby usunąć zależności zainstalowane przez pip ...
Jean Paul
Prawdziwe. Myślę, że usunie to zależności Conda, ale nie te wymienione w pip
Blink
22

Odpowiedź alkamidu jest słuszna, ale odkryłem, że Conda nie instaluje nowych zależności, jeśli środowisko jest już aktywne. Dezaktywacja środowiska najpierw rozwiązuje ten problem:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Dave
źródło
4
Skąd conda wie, które środowisko zaktualizować, jeśli nie jest to aktualnie aktywne?
Thomas Fauskanger
5
@ThomasFauskanger możesz to wyraźnie określić -n <environment name>, ale domyślnie wydaje się, że działa z oczekiwanym środowiskiem (może ostatnio aktywnym lub po prostu domyślnym wyborem środowiska)
Dave
18
@ThomasFauskanger Nazwa środowiska jest określona w pliku YAML, jeśli zostało wyeksportowane przez condę.
Thomas
Myślałem, że starym punktem tego pytania jest zaktualizowanie innego środowiska niż określone w pliku yaml.
Giacomo
1
@ThomasFauskanger plik yaml zawiera nazwę środowiska
Abdulrahman Bres