So aktualisieren Sie eine vorhandene Conda-Umgebung mit einer .yml-Datei

135

Wie kann eine bereits vorhandene Conda-Umgebung mit einer anderen .yml-Datei aktualisiert werden? Dies ist äußerst hilfreich, wenn Sie an Projekten arbeiten, die mehrere Anforderungsdateien enthalten, z. B. base.yml, local.yml, production.ymlusw.

Im Folgenden finden Sie beispielsweise eine base.ymlDatei mit den Paketen conda-forge, conda und pip:

base.yml

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

Die eigentliche Umgebung wird erstellt mit : conda env create -f base.yml.

Später müssen zusätzliche Pakete hinzugefügt werden base.yml. Eine andere Datei local.ymlmuss beispielsweise diese Updates importieren.

Frühere Versuche, dies zu erreichen, umfassen:

Erstellen einer local.ymlDatei mit einer Importdefinition:

channels:

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

Führen Sie dann den folgenden Befehl aus : conda install -f local.yml.

Das funktioniert nicht. Irgendwelche Gedanken?

Tilikoom
quelle
Ist es möglich, die aktuell aktivierte Umgebung zu aktualisieren? Ich habe es gerade versucht, aber das Update ging an die in der yml-Datei angegebene Umgebung.
Sören

Antworten:

200

Versuchen Sie es mit conda env update :

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

Oder ohne die Umgebung aktivieren zu müssen (danke @NumesSanguis):

conda env update --name myenv --file local.yml
Alkamid
quelle
12
Sie brauchen kein Gleichheitszeichen zwischen -fund file.yml. Durch Entfernen des Gleichheitszeichens wird die Tab-Vervollständigung des .ymlDateinamens ausgeführt.
BallpointBen
4
Hinzufügen --name env_name, um name: fooTags in zu ignorieren local.yml. Verhindert auch die Notwendigkeit, zuerst myenv zu aktivieren. Vollständiger Befehl: conda env update --name env_name --file local.yml Von: stackoverflow.com/a/45525593/3399066 's Kommentar
NumesSanguis
1
In der neuesten Conda-Version verwenden wir wahrscheinlich "Conda Activate Myenv" anstelle von "Source Activate Myenv"
teter123f
30

Die vorgeschlagene Antwort ist teilweise richtig. Sie müssen die Option --prune hinzufügen, um auch Pakete zu deinstallieren, die aus der Datei environment.yml entfernt wurden. Richtiger Befehl:

conda env update -f local.yml --prune
Blinken
quelle
Selbst das Flag --prune reicht nicht aus, um installierte Pip-Abhängigkeiten zu entfernen ...
Jean Paul
Wahr. Ich denke, es wird die Conda-Abhängigkeiten entfernen, aber nicht die unter pip
Blink
22

Die Antwort von alkamid ist in der richtigen Zeile, aber ich habe festgestellt, dass Conda keine neuen Abhängigkeiten installiert, wenn die Umgebung bereits aktiv ist. Durch Deaktivieren der Umgebung wird zunächst Folgendes behoben:

source deactivate;
conda env update -f whatever.yml;
source activate my_environment_name; # Must be AFTER the conda env update line!
Dave
quelle
4
Woher weiß conda, welche Umgebung aktualisiert werden soll, wenn sie nicht die aktuell aktive ist?
Thomas Fauskanger
5
@ThomasFauskanger Sie können es explizit mit angeben -n <environment name>, aber standardmäßig scheint es mit der erwarteten Umgebung zu funktionieren (möglicherweise die zuletzt aktive oder nur eine Standardumgebung)
Dave
18
@ThomasFauskanger Der Name der Umgebung wird in der YAML-Datei angegeben, wenn sie von conda exportiert wurde.
Thomas
Ich dachte, der alte Punkt dieser Frage ist, eine andere Umgebung als die in der yaml-Datei angegebene zu aktualisieren.
Giacomo
1
@ ThomasFauskanger Die Yaml-Datei enthält den Umgebungsnamen
Abdulrahman Bres