什么是 Conda?
Conda 是一个开源的包管理系统和环境管理系统,换句话说,conda 可以创建独立的环境,在环境中安装不一样的 packages,用来完成不一样的项目,并且在这个过程中避免环境冲突
- 包管理:类似于
pip或npm,负责安装库 - 环境管理:类似于
.venv,但权限更高。它不仅能隔离 Python 库,还能隔离 Python 解释器本身 以及 系统级依赖(如 CUDA, C++ 编译器)
Anaconda & Miniconda
- Anaconda:安装包很大(数 GB),自带了可能永远用不到的科学计算包
- Miniconda:最简版本,只包含 Conda 和 Python
Conda Vs. .venv :
| 特性 | .venv | Conda |
|---|---|---|
| 隔离深度 | 仅限 Python 库 | Python 版本 + 库 + 二进制依赖 (CUDA/C++) |
| 安装位置 | 项目文件夹内 (.venv/) |
集中存放于 ~/miniconda3/envs/ |
| 包来源 | 仅限 PyPI (pip) |
Conda Channels (conda-forge, nvidia, pytorch) |
| 跨平台性 | 依赖系统已安装的 Python | 自带解释器,跨平台一致性极强 |
- 隔离深度:库 Vs. 系统
- .venv:不同
.venv共享同一个 Python 解释器。如果一个项目要 Python 3.8,另一个要 3.12,.venv解决不了这个问题 - Conda:Python 版本、CUDA 驱动(跑 AI 必备)、底层 C 语言库都是按需定制的
- .venv:不同
- 安装位置:分散 Vs. 集中
- .venv:它是“项目导向”的。每个项目下面都有一个,你一眼就能看到。好处是清理方便,删掉项目就删掉了环境
- Conda:它是“管理导向”的。每一个
conda环境都整齐地排在系统的某个角落,你可以在任何文件夹下通过命令运行某个环境
- 包来源:源码 Vs. 二进制成品
- pip (PyPI):大部分时候给你的是源码,你的电脑得负责把它们组装起来。如果你的 C++ 编译器没配好,安装就会报错
- Conda (Channels):很多时候给你的是“成品”(预编译二进制文件)。别人已经在服务器上帮你组装并测试好了,你直接下载下来就能跑
- 依赖系统 Vs. 自给自足
- .venv:它是寄生在系统 Python 上的,系统 Python 坏了,它也跑不动
- Conda:它是自给自足的,它会下载完整的 Python 解释器放在环境里
Conda 常用命令
A. 环境创建与切换
1 | # 创建一个名为 research 的环境,并指定 Python 版本(这在 .venv 里很难做到),-n代表 --name |
B. 安装包
Conda 会自动解决复杂的二进制依赖
1 | # 安装 pytorch,并指定从 pytorch 和 nvidia 的渠道获取,自动配置 CUDA,渠道(Channel)是 Conda 寻找软件包的服务器地址。-c 是 --channel 的缩写 |
-c pytorch: 指定从 PyTorch 官方渠道下载-c nvidia: 指定从 NVIDIA 官方渠道下载 CUDA 相关的依赖项
C. 查看与清理
1 | # 列出所有已创建的环境 |
环境的可移植性 (Environment YAML)
要复现实验时,你不能把整个环境发过去。你需要一个“配方”
- 导出配方:
1 | conda env export > environment.yml |
- 根据配方重建:
1 | conda env create -f environment.yml |
补充:pip & conda channel
理解“包来源”(Package Sources)的区别,本质上是理解“这些代码是谁在维护”以及“它们被存储在哪里”
1. PyPI (pip 的唯一官方仓库)
PyPI (Python Package Index) 是 Python 官方唯一的“大仓库”
- 逻辑:它是全球统一的。如果你写了一个 Python 库并想让全世界使用,你必须把它上传到 PyPI
- 工作方式:当你执行
pip install xxxx时,pip 会直接去 PyPI 这一个地方寻找并下载 - 局限性:PyPI 里的包通常只包含 Python 代码。如果你的库需要调用复杂的底层 C++ 编译器,或者是特定的显卡驱动(比如做机器人仿真需要的 CUDA),PyPI 往往很难处理这些非 Python 的依赖项
2. Conda Channels (Conda 的“频道/专柜”)
Conda 的逻辑完全不同。它允许存在多个不同的独立仓库,这些仓库就叫 Channels(频道)
你可以把 Conda 想象成一个巨大的商场,里面分布着不同的“专柜”:
- Defaults 频道:这是 Anaconda 公司官方维护的柜台。它的特点是包经过严格测试,非常稳定,但缺点是更新速度较慢,包的数量有限
- conda-forge 频道 (社区柜台):这是科研人员最常用的频道。它是由全球开发者社区共同维护的“公共柜台”。它的特点是包最全、更新极快。如果你发现一个科研工具在默认频道找不到,去
conda-forge一定有 - nvidia / pytorch / fastai (厂商专柜):
- nvidia 频道:专门提供针对显卡优化的底层驱动和工具(如 CUDA、cuDNN)
- pytorch 频道:由 PyTorch 官方维护,专门提供已经配置好、可以直接运行的深度学习框架
3. 为什么我们要区分不同的“频道”?
conda install pytorch -c pytorch -c nvidia
这里的 -c 就是 Channel 的缩写。这句话的逻辑是:
“我要安装 pytorch,请优先去
pytorch官方专柜和nvidia官方专柜找;如果这两个地方都没有,再去默认柜台找。”
这样做有三个核心好处:
- 版本更精准:直接从厂商(如 Nvidia)的频道下载,能确保你拿到的包是针对你的硬件(GPU)优化过的
- 解决依赖问题:Conda 频道里的包通常是预编译好的二进制文件。在 PyPI 里,安装复杂的库可能需要在本地配置 C++ 环境,但在 Conda 频道里,别人已经帮你编译好了,下载即用
- 优先级控制:你可以设置 Conda 优先从
conda-forge找东西,这样能保证你的整个开发环境所用的库版本是最新的
| 特性 | PyPI (pip) | Conda Channels |
|---|---|---|
| 数量 | 全球只有一个中心仓库 | 拥有多个独立的频道(专柜) |
| 内容 | 主要是 Python 源码 | 预编译好的二进制文件(含 Python 和非 Python 依赖) |
| 维护者 | 个人开发者直接上传 | 社区 (conda-forge) 或 硬件厂商 (Nvidia/Pytorch) |
| 优势 | 包的数量全球最多 | 极其擅长处理复杂的 AI 和工程依赖 |