conda export and import feature is ideal functionality to build a predefined environment from a list in a text file.
Here are some caveats (or features), which may stumble the user to build a working conda environment list file:
- There are packages, which are not available for all OS platforms. There are packages, which are only available in Linux platforms and other only under Windows platform!
- There are package names, followed by version and build version. All three a valid entries in the list file – only the name of the package, the name of the package with version and the name of the package with version and build version. For example,
- setuptools=58.0.4=py38h06a4308_0 - sqlite=3.37.0=hc218d9a_0 - tk=8.6.11 - wheel
- Builds’ versions are specific for the OS and they are different for every Operating systems.
- Packages’ versions do tend to deprecate, so the old environment may not be possible to replicate because of a missing package version. Exported list with version, which are unavailable any more and so it cannot be imported.
- A good practice is to update the current working environment with the latest updates before exporting it.
- Export environment list without build versions. Edit the exported environment list if some version is missing. The version of the packages could be removed, too.
- The exported environment list uses yaml format.
1) Here is the command to export an environment list of a python environment with and without builds and versions of the packages:
- With builds versions
(base) myenv@srv ~ $ conda env export -n mypython37 name: mypython37 channels: - defaults dependencies: - _libgcc_mutex=0.1=main - _openmp_mutex=4.5=1_gnu - ca-certificates=2021.10.26=h06a4308_2 - certifi=2021.10.8=py37h06a4308_2 - ld_impl_linux-64=2.35.1=h7274673_9 - libffi=3.3=he6710b0_2 - libgcc-ng=9.3.0=h5101ec6_17 - libgomp=9.3.0=h5101ec6_17 - libstdcxx-ng=9.3.0=hd4cf53a_17 - ncurses=6.3=h7f8727e_2 - openssl=1.1.1m=h7f8727e_0 - pip=21.2.2=py37h06a4308_0 - python=3.7.11=h12debd9_0 - readline=8.1.2=h7f8727e_1 - setuptools=58.0.4=py37h06a4308_0 - sqlite=3.37.0=hc218d9a_0 - tk=8.6.11=h1ccaba5_0 - wheel=0.37.1=pyhd3eb1b0_0 - xz=5.2.5=h7b6447c_0 - zlib=1.2.11=h7f8727e_4 prefix: /home/myenv/miniconda3/envs/mypython37
By default, the output is in the console with YAML syntax. There is a JSON option and a file option to output it in a file:
conda env export -n mypython37 -f ./mypython37.yml
(base) myenv@srv ~ $ conda env export -n mypython37 -f ./mypython37.yml (base) myenv@srv ~ $ conda env export -n mypython37 --json { "channels": [ "defaults" ], "dependencies": [ "_libgcc_mutex=0.1=main", "_openmp_mutex=4.5=1_gnu", "ca-certificates=2021.10.26=h06a4308_2", "certifi=2021.10.8=py37h06a4308_2", "ld_impl_linux-64=2.35.1=h7274673_9", "libffi=3.3=he6710b0_2", "libgcc-ng=9.3.0=h5101ec6_17", "libgomp=9.3.0=h5101ec6_17", "libstdcxx-ng=9.3.0=hd4cf53a_17", "ncurses=6.3=h7f8727e_2", "openssl=1.1.1m=h7f8727e_0", "pip=21.2.2=py37h06a4308_0", "python=3.7.11=h12debd9_0", "readline=8.1.2=h7f8727e_1", "setuptools=58.0.4=py37h06a4308_0", "sqlite=3.37.0=hc218d9a_0", "tk=8.6.11=h1ccaba5_0", "wheel=0.37.1=pyhd3eb1b0_0", "xz=5.2.5=h7b6447c_0", "zlib=1.2.11=h7f8727e_4" ], "name": "mypython37", "prefix": "/home/myenv/miniconda3/envs/mypython37" }
The first line uses “-f” to save the output to a file and the second line uses json option to output the environment file in JSON format.
- Without builds versions. Use the “–no-builds” option:
(base) myenv@srv ~ $ conda env export -n mypython37 --no-builds name: mypython37 channels: - defaults dependencies: - _libgcc_mutex=0.1 - _openmp_mutex=4.5 - ca-certificates=2021.10.26 - certifi=2021.10.8 - ld_impl_linux-64=2.35.1 - libffi=3.3 - libgcc-ng=9.3.0 - libgomp=9.3.0 - libstdcxx-ng=9.3.0 - ncurses=6.3 - openssl=1.1.1m - pip=21.2.2 - python=3.7.11 - readline=8.1.2 - setuptools=58.0.4 - sqlite=3.37.0 - tk=8.6.11 - wheel=0.37.1 - xz=5.2.5 - zlib=1.2.11 prefix: /home/myenv/miniconda3/envs/mypython37
2) Import conda environment file.
Import the conda environment file above by executing the following commands.
First, create the conda environment if missing.
(base) myenv2@srv ~ $ cat ./mypython37.yml name: mypython37 channels: - defaults dependencies: - _libgcc_mutex=0.1 - _openmp_mutex=4.5 - ca-certificates=2021.10.26 - certifi=2021.10.8 - ld_impl_linux-64=2.35.1 - libffi=3.3 - libgcc-ng=9.3.0 - libgomp=9.3.0 - libstdcxx-ng=9.3.0 - ncurses=6.3 - openssl=1.1.1m - pip=21.2.2 - python=3.7.11 - readline=8.1.2 - setuptools=58.0.4 - sqlite=3.37.0 - tk=8.6.11 - wheel=0.37.1 - xz=5.2.5 - zlib=1.2.11 prefix: /home/myenv/miniconda3/envs/mypython37 (base) myenv2@srv ~ $ conda create --name mypython37 Collecting package metadata (current_repodata.json): done Solving environment: done ## Package Plan ## environment location: /home/myenv2/miniconda3/envs/mypython37 Proceed ([y]/n)? y Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate mypython37 # # To deactivate an active environment, use # # $ conda deactivate
Import, i.e. update the conda environment with the environment file.
(base) myenv2@srv ~ $ conda env update -n mypython37 --file ./mypython37.yml Collecting package metadata (repodata.json): done Solving environment: done Downloading and Extracting Packages setuptools-58.0.4 | 775 KB | ############################################################# | 100% wheel-0.37.1 | 33 KB | ############################################################# | 100% certifi-2021.10.8 | 151 KB | ############################################################# | 100% python-3.7.11 | 45.3 MB | ############################################################# | 100% pip-21.2.2 | 1.8 MB | ############################################################# | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate mypython37 # # To deactivate an active environment, use # # $ conda deactivate (base) myenv2@srv ~ $ conda activate mypython37 (mypython37) myenv2@srv ~ $ python -V Python 3.7.11
The import of the environment lists generated with builds versions of the packages is the same as without builds. “conda env update” would try to resolve the requested files and if they are missing an error will be shown, if not the environment will be updated according to the environment file.
3. Fail to import an environment because of unresolvable files.
Solving environment: failed.
Exported environment list from a Windows host and trying to import it under Linux. It fails with missing files because there are no such files for Linux distributions (even the file has no build version and package version):
(base) myenv@srv ~ $ cat ./windows-flow.yml name: windows-flow channels: - defaults dependencies: - _tflow_select=2.3.0 - pyreadline=2.1 - vc=14.2 - vs2015_runtime - win_inet_pton=1.1.0 - wincertstore=0.2 - pyreadline=2.1 - werkzeug=2.0.2 - wheel=0.37.0 - wrapt=1.12.1 - xz=5.2.5 - yarl=1.6.3 - zipp=3.6.0 - zlib=1.2.11 - zstd=1.4.9 prefix: C:\Users\myenv\Anaconda3\envs\windows-flow (base) myenv@srv ~ $ conda env update --name test_env -f ./windows-flow.yml Collecting package metadata (repodata.json): done Solving environment: failed ResolvePackageNotFound: - wincertstore=0.2 - vs2015_runtime - vc=14.2 - pyreadline[version='2.1.*,2.1.*'] - win_inet_pton=1.1.0 (base) myenv@srv ~ $
The package vs2015_runtime cannot be resolved even without any version!
Missing build and after removing the builds information in the environment file the import is successful:
(base) myenv@srv ~ $ cat test-env-builds.yml name: test-env-builds channels: - defaults dependencies: - _tflow_select=2.3.0=mkl - cryptography=3.4.8=py38h71e12ea_0 prefix: /home/myenv2/miniconda3/envs/test-env-builds (base) myenv@srv ~ $ conda env update --name test_env -f ./test-env-builds.yml Collecting package metadata (repodata.json): done Solving environment: failed ResolvePackageNotFound: - cryptography==3.4.8=py38h71e12ea_0 (base) myenv@srv ~ $ cat test-env-builds.yml name: test-env-builds channels: - defaults dependencies: - _tflow_select=2.3.0=mkl - cryptography=3.4.8 prefix: /home/myenv2/miniconda3/envs/test-env-builds (base) myenv@srv ~ $ conda env update --name test_env -f ./test-env-builds.yml Collecting package metadata (repodata.json): done Solving environment: done Downloading and Extracting Packages python-3.9.7 | 18.6 MB | ############################################################# | 100% cryptography-3.4.8 | 946 KB | ############################################################# | 100% pip-21.2.4 | 1.8 MB | ############################################################# | 100% _tflow_select-2.3.0 | 2 KB | ############################################################# | 100% Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate test_env # # To deactivate an active environment, use # # $ conda deactivate
Sometimes even the package is available but not the version mentioned in the environment file, so by removing the package version, the environment list would be imported.