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
一样残废。
参考: