Conda: Managing Environments

 20th August 2020 at 2:19pm

Conda 环境管理。

Conda 的命令行写得一般,而且莫名其妙地有两种管理 env 的方式,分别是直接用 conda 以及用 conda-env

创建新环境:

  • 如果你想通过 environment.yaml 文件创建新环境,只能用 conda env
  • 如果你想通过指定包来创建新环境,只能用 conda create

导出已有环境:

  • conda list --export 会导出当前所有 Conda 包,但是不会导出 pip 所安装的包,所以没什么用
  • conda env export 会导出 Conda 包及 pip 安装的包,生成的文件即 environment.yaml,可以用来分享环境

用 environment.yaml 来实现「不同机器上环境一致」,应该是目前 Conda 的最佳实践。但是它的设计还是残缺的,这使得 Conda 难以成为广泛流行的部署工具。

对比 pipenv 提供的解决方案,pipenv 提供了 Pipfile 和 Pipfile.lock。Pipfile 用来指定项目中所依赖的库,比如我的项目用了 Django,那就在 Pipfile 中写入 Django 即可;pipenv 会自动帮我判断 Django 有个 pytz 的依赖,然后它会生成 Pipfile.lock 文件,里面包含了 Django 和 pytz,以及它们具体的版本号。

environment.yaml 就类似 Pipfile.lock,但是 Conda 没有提供 Pipfile 的机制。那么,假如我一开始 conda install django,那么 Django 跟 pytz 会同时会安装被纪录进环境依赖里;后面如果我想把 Django 换成 Flask,conda uninstall django 并不会帮我把 pytz 去掉。于是 pytz 作为一个没人用的依赖,存在在 conda env 里。

environment.yaml 中也可以指定 pip 的命令行选项,参考这个 pull request。但是 environment.yaml 的定位应该是机器生成而不是手写,意味着这个特性很鸡肋。

总的来说 environment.yaml 就跟 pip freeze > requirements.txt 一样残废。

参考: