Conda 全面讲解------数据科学家的标配工具
「Python 包管理全攻略」系列第四篇。如果你搞数据科学或者机器学习,Conda 基本是绕不过去的。
Conda 和 pip 有什么不同?
先搞清楚定位:
- pip 是 Python 的包管理器,只管 Python 包
- Conda 是跨语言的包管理器 + 环境管理器,它不仅能装 Python 包,还能装 C 库、R 语言包、CUDA 工具包等等
举个实际例子:你想装 PyTorch 的 GPU 版本,用 pip 的话,你还得自己装 CUDA 驱动、cuDNN,搞不好版本对不上。用 Conda 的话,conda install pytorch pytorch-cuda=12.1 -c pytorch -c nvidia 一条命令,CUDA 相关依赖自动帮你装好。
这就是 Conda 在科学计算领域不可替代的原因------它能管理非 Python 的系统级依赖。
安装 Conda
Anaconda vs Miniconda vs Miniforge
这三个东西容易搞混:
| 工具 | 说明 | 包大小 |
|---|---|---|
| Anaconda | 全家桶,预装了几百个数据科学包 + 图形界面 | ~4 GB |
| Miniconda | 只有 Conda 和 Python,啥都不预装 | ~100 MB |
| Miniforge | 社区维护的 Miniconda 替代品,默认用 conda-forge 源 | ~100 MB |
我的建议:
- 电脑空间够、不想折腾 → Anaconda
- 想自己控制装什么 → Miniconda 或 Miniforge
- 公司项目、注意许可证 → 用 Miniforge(Anaconda 的商业使用需要付费许可证,200 人以上的公司要注意)
安装 Miniconda
bash
# Linux
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# macOS(Apple Silicon)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh
bash Miniconda3-latest-MacOSX-arm64.sh
# macOS(Intel)
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash Miniconda3-latest-MacOSX-x86_64.sh
安装过程中会问你要不要把 Conda 加到 shell 初始化脚本里,选 yes。装完之后:
bash
# 重新加载 shell 配置
source ~/.bashrc # 或 source ~/.zshrc
# 验证安装
conda --version
环境管理:Conda 的核心能力
创建环境
bash
# 创建一个叫 data-science 的环境,装 Python 3.11
conda create -n data-science python=3.11
# 创建环境的同时装包
conda create -n ml python=3.11 numpy pandas scikit-learn
-n 后面是环境名称,这个名称是全局的,你在任何目录下都能用这个名字激活环境。不像 venv,每个环境是个文件夹,得记路径。
激活和退出环境
bash
# 激活
conda activate data-science
# 退出
conda deactivate
激活后命令行前面会出现 (data-science),和 venv 类似。
查看所有环境
bash
conda env list
# 或者
conda info --envs
删除环境
bash
conda remove -n data-science --all
克隆环境
bash
conda create -n data-science-backup --clone data-science
做实验之前先克隆一份环境,搞坏了随时恢复,非常实用。
导出和导入环境
bash
# 导出
conda env export > environment.yml
# 导入
conda env create -f environment.yml
# 导入时指定环境名
conda env create -n my-env -f environment.yml
导出的 environment.yml 长这样:
yaml
name: data-science
channels:
- conda-forge
- defaults
dependencies:
- python=3.11.8
- numpy=1.26.4
- pandas=2.2.1
- pip:
- some-package-only-on-pypi==1.0.0
注意 pip: 那个部分------如果有些包 Conda 里没有,可以在 yml 里指定用 pip 安装。
包管理
装包
bash
# 基本安装
conda install numpy
# 指定版本
conda install numpy=1.26.4
# 同时装多个
conda install numpy pandas matplotlib
从特定频道装包
bash
conda install -c conda-forge scipy
-c 指定频道(channel),可以理解为不同的软件源。后面详细讲。
更新包
bash
conda update numpy
conda update --all # 更新所有包(谨慎使用)
卸载包
bash
conda remove numpy
搜索包
bash
conda search tensorflow
这个命令会显示 tensorflow 在所有频道里的所有可用版本,信息很全。
Channel(频道)机制
Channel 是 Conda 独有的概念,相当于软件仓库。
默认频道
bash
defaults # Anaconda 官方维护
conda-forge:最重要的社区频道
conda-forge 是社区维护的频道,包的数量远超 defaults,更新也更快。很多新包只有在 conda-forge 里才有。
bash
# 临时使用
conda install -c conda-forge some-package
# 永久添加到搜索路径(推荐)
conda config --add channels conda-forge
# 设置 conda-forge 优先级最高
conda config --set channel_priority strict
如果你用 Miniforge,conda-forge 默认就是第一优先级,不用手动配。
频道优先级问题
当同一个包在多个频道里都有时,Conda 按照频道优先级来选。建议设成 strict 模式,避免混用不同频道的包导致依赖冲突:
bash
conda config --set channel_priority strict
Conda 和 pip 混用
这是很多人纠结的问题:Conda 里没有的包,能不能用 pip 装?
能,但有规则:
- 先用 Conda 装能装的,再用 pip 装剩下的
- 在 Conda 环境里用 pip 没问题,但别在 Conda 环境外用 pip 装包然后指望 Conda 能识别
- 用
environment.yml统一管理 ,把 pip 的包写在pip:下面
yaml
dependencies:
- python=3.11
- numpy
- pip:
- some-obscure-package
最忌讳的操作是: 用 pip 装了一堆包,然后用 Conda 更新其中一个,Conda 不知道 pip 装了啥,可能把依赖搞乱。
Conda 的配置文件
Conda 的全局配置在 ~/.condarc 文件里:
yaml
channels:
- conda-forge
- defaults
channel_priority: strict
show_channel_urls: true
auto_activate_base: false # 不想每次开终端都自动激活 base 环境
几个常用配置:
bash
# 不自动激活 base 环境(推荐,避免误操作)
conda config --set auto_activate_base false
# 显示包的频道来源
conda config --set show_channel_urls true
# 查看所有配置
conda config --show
Conda 的常见坑
坑 1:solve environment 卡住不动
Conda 解析依赖关系有时候非常慢,尤其是环境里包很多的时候。
解法:
bash
# 换用 libmamba 解析器(Conda 23.10+ 已内置)
conda config --set solver libmamba
libmamba 是用 C++ 重写的依赖解析器,速度能快几十倍。换完之后 Conda 的体验完全不一样。
坑 2:base 环境越来越臃肿
很多人装什么都往 base 环境里装,时间一长 base 环境里几百个包,慢得要死,还容易冲突。
原则:别动 base 环境。 每个项目建一个新环境,base 环境只用来装 Conda 本身。
坑 3:Conda 和系统 Python 搞混
Conda 装的 Python 和系统的 Python 是独立的。有时候你在 Conda 环境里 pip install 了一个包,但系统 Python 找不到,反之亦然。这是正常的,它们本来就是隔离的。
Conda 的替代方案
如果你觉得 Conda 太慢太重,可以看看:
- Mamba:Conda 的 C++ 重写版,兼容 Conda 命令,速度快很多。Miniforge 已经默认用 mamba 了
- Micromamba:Mamba 的纯 C++ 单文件版,连 Python 都不需要就能运行
- Pixi:新一代包管理器,基于 Conda 生态但更现代
不过大多数情况下,Conda + libmamba solver 已经够用了。
面试题
1. Conda 和 pip 的核心区别是什么?
pip 只管 Python 包,Conda 是跨语言的包管理器,可以管理 Python 包、C/C++ 库、CUDA 工具包等非 Python 依赖。Conda 还自带环境管理功能。在科学计算场景下,很多包依赖复杂的 C 库(如 BLAS、LAPACK、CUDA),Conda 能一并解决,pip 做不到。
2. Anaconda 的商业使用有什么需要注意的?
从 2020 年起,Anaconda 对 200 人以上的商业公司使用 defaults 频道收费。如果你在大公司,建议使用 Miniforge + conda-forge,或者购买 Anaconda 商业许可证。小公司和个人使用不受影响。
3. 为什么 Conda 解析依赖有时候很慢?怎么解决?
Conda 的默认依赖解析器是用 Python 写的,在包多的环境下性能差。解决方案是切换到 libmamba 解析器:
conda config --set solver libmamba。libmamba 用 C++ 实现,速度快几十倍。新版 Conda 已经内置了 libmamba。
4. 在 Conda 环境里混用 pip 装包有什么注意事项?
原则是"Conda 优先":先用 Conda 装能装的包,再用 pip 装 Conda 没有的。避免用 pip 安装后再用 Conda 更新同一个包,容易导致依赖不一致。推荐用 environment.yml 统一管理,pip 的包写在
pip:节下。