Anaconda 是一个面向数据科学的 Python 发行版,它打包了 Conda、Python 和一堆机器学习和人工智能相关和常用的包,而且还可以用来安装一些非 Python 编写的库。对于科学计算相关的用途非常方便,开箱即用。看起来很适合实验室或是学校机房使用……
对于常规的 Python 开发来说,Anaconda 太重了,而且主要面向科学计算领域,但是精简版的 Miniconda 却是一个很好的 Python 版本和虚拟环境管理工具。
更重要的是 Miniconda 兼容三个主流操作系统,而且不同平台使用同样的命令和接口(Conda 4.6 以上)。这大概算是个人偏好,因为我总在写东西给别人看,所以总是喜欢兼容主流操作系统并且接口统一的解决方案。而且另一方面 pyenv、virtualenvwrapper、direnv 等等相关替代工具都没有原生 Windows 支持。
Miniconda 是什么
先来理清几个概念:
- Conda:包、依赖和环境管理器。
- Anaconda(某种蟒蛇的名字):面向数据科学的 Python 发行版,包含 conda、conda-build、Python 和 100+ 常用的数据科学常用的库及其依赖。
- Miniconda:精简版的 Anaconda,也是一个 Python 发行版,只包含 conda、Python 和一些基本的包。
相关资源:
- 主页:https://conda.io/en/latest/
- 源码:https://github.com/conda/conda
- 文档:https://conda.io/projects/conda/en/latest/
Miniconda 基本用法
首先你需要访问下载页面下载对应操作系统的安装包进行安装,Python 版本选择你想作为默认选项(base version)的版本。然后打开 Windows 下的 Anaconda Prompt 或是 Anaconda Powershell Prompt,Linux 或 macOS 直接使用终端程序。
下面是一些关键用法介绍,详细内容可以阅读 Conda 文档。
创建虚拟环境
使用 conda create 命令创建虚拟环境,使用 –name 选项(-n)指定虚拟环境名称:
$ conda create --name foo
使用 conda info 命令查看当前环境名称、Python 版本、虚拟环境文件夹位置、Conda 版本等等各种信息:
$ conda info
使用 –envs 选项(-e)查看所有已创建的虚拟环境。在列出的虚拟环境中,使用星号(*)标识的是当前激活的虚拟环境:
$ conda info --envs
激活虚拟环境
使用 conda activate 命令激活虚拟环境,添加虚拟环境名作为参数:
$ conda activate foo
激活以后会在命令行提示器前显示虚拟环境名称,比如:
(foo) $
不添加虚拟环境名称,就会重新激活基础环境(base):
$ conda activate
设置虚拟环境的 Python 版本
在创建虚拟环境的时候,可以使用 python 参数指定 Python 版本。假设你使用的 Miniconda 默认版本是 Python 3.7,如果你想创建一个 Python 2.7 的虚拟环境,使用下面的命令:
$ conda create --name snakes python=2.7
你可以在虚拟环境名加上标识方便识别 Python 版本,比如:
$ conda create --name snakes-py27 python=2.7
搭配 pip / Poetry 来管理依赖
因为 Conda 安装库的时候默认使用 Conda 自己的仓库,这里包含的 720 多个库除了流行的 Python 包外大多是数据科学相关的包。所以,更好的选择是使用官方 PyPI 仓库,这样可以确保你使用到最近更新的包,而且不会出现有些包找不到的情况。
我们要做的就是只用 Conda 的 Python 版本和虚拟环境管理功能,不用它来管理依赖。依赖管理(安装、卸载、更新等)仍然使用 pip 进行,或是进一步搭配 pip-tools 来管理依赖。
你需要在 conda 环境内使用下面的命令安装 pip:
$ conda install pip
或是统一使用下面的命令格式创建虚拟环境:
$ conda create --name bar pip
这样在执行 pip 命令时会使用虚拟环境内的 pip,而不是系统全局的 pip。这样做的副作用是会产生几个多余的依赖。
除此之外,你也可以搭配使用 Poetry。Poetry 默认会自动创建虚拟环境,所以需要关闭 Poetry 自动创建虚拟环境的设定,执行下面的命令即可:
$ poetry config settings.virtualenvs.create false
总结
按照我目前掌握到的信息,Miniconda 的优缺点总结如下:
优点
- 用法简单,易于上手
- 替代 pyenv+virtualenv/venv+virtualenvwrapper 的多个工具组合
- 类似 virtualenvwrapper,可以在任意位置激活虚拟环境,而不是必须在项目根目录
- 支持管理不同的 Python 版本
- 兼容性很好,支持 Windows
缺点
- 在 Windows 下,需要使用专用的命令行程序
- 依赖管理比较弱,需要搭配 pip/Poetry 来使用
- conda 和 pip/Poetry 组合存在潜在的冲突,但情况在改善
既然一个 Miniconda 就能很好的胜任 Python 版本管理和虚拟环境管理的任务,为什么要用 pyenv+virtualenv/venv+virtualenvwrapper 呢?遗憾的就是依赖管理功能不够完善,和 pip/Poetry 搭配使用则可能会有潜在的冲突。所以,推荐觉得 virtualenv/venv+pip 搭配太麻烦的初学者使用;推荐能接受 Conda+pip/Poetry 这种搭配的人使用;推荐使用 Python 做数据科学相关工作的人使用。
对比之下,最稳定的解决方案大概还是 virtualenv/venv+pip+其他工具……
(如果你发现了错误描述、有不同看法和想要补充的信息,欢迎评论。)
(3)
Poetry version 1.0.5 版本中关闭自动创建虚拟环境命令由:
poetry config settings.virtualenvs.create false
改为
poetry config virtualenvs.create false
PS:老师要是能在 helloflask 上插个公告板就好了,最开始因为 locking 问题着手替换 pipenv 的时候还是走了点弯路
谢谢提醒,书的页面放了一个短提示。