ChatGPT解决这个技术问题 Extra ChatGPT

How to update an existing Conda environment with a .yml file

How can a pre-existing conda environment be updated with another .yml file. This is extremely helpful when working on projects that have multiple requirement files, i.e. base.yml, local.yml, production.yml, etc.

For example, below is a base.yml file has conda-forge, conda, and pip packages:

base.yml

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

The actual environment is created with: conda env create -f base.yml.

Later on, additional packages need to be added to base.yml. Another file, say local.yml, needs to import those updates.

Previous attempts to accomplish this include:

creating a local.yml file with an import definition:

channels:

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

And then run the command: conda install -f local.yml.

This does not work. Any thoughts?

Is it possible to update the currently activated environment?? I just tried this but the update went to the environment named in the yml file.
this might be useful to start from scratch: conda env create -f ~/CoqGym/coq_gym.yml (see: stackoverflow.com/questions/54492671/…)

a
alkamid

Try using conda env update:

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

--prune uninstalls dependencies which were removed from local.yml, as pointed out in this answer by @Blink.

Or without the need to activate the environment (thanks @NumesSanguis):

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

See Updating an environment in Conda User Guide.


You don't need the equals sign between -f and file.yml. Removing the equals sign will make tab completion work on the .yml filename.
Add --name env_name to ignore any name: foo tag in local.yml. Also prevents the need to activate myenv first. Full command: conda env update --name env_name --file local.yml From: stackoverflow.com/a/45525593/3399066 's comment
In the most recent conda version I think we use "conda activate myenv" instead of "source activate myenv"
Is there any way, we can pass an argument where this command will just update available libraries in .yml files, which will ensure that error is not thrown when any of the library listed is not available?
make sure that the YAML file has no name parameter, otherwise it creates with this update command
B
Blink

The suggested answer is partially correct. You'll need to add the --prune option to also uninstall packages that were removed from the environment.yml. Correct command:

conda env update -f local.yml --prune

Even the --prune flag is not enough to remove pip installed dependencies...
True. I think it will remove the conda dependencies but not the ones listed under pip
Is there any way, we can pass an argument where this command will just update available libraries in .yml files, which will ensure that error is not thrown when any of the library listed is not available?
would there be a problem if my requirements.yml file has a name: at the top?
D
Dave

alkamid's answer is on the right lines, but I have found that Conda fails to install new dependencies if the environment is already active. Deactivating the environment first resolves this:

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

How does conda know which env to update if it's not the currently active one?
@ThomasFauskanger you can specify it explicitly with -n <environment name>, but by default it seems to work with the expected environment (maybe the most recently active, or just a default environment choice)
@ThomasFauskanger The name of the environment is specified in the YAML file if it has been exported by conda.
I thought the old point of this question is to update a different environment to the one specified in the yaml file.
@ThomasFauskanger the yaml file includes the environment name