Conda 实战指南(偏详细版)
0. 总体认识:conda 究竟解决什么问题?
一句话:
conda = 环境管理器(虚拟环境) + 包管理器(跨语言包),解决"依赖地狱 + 环境冲突"。
和你已经熟悉的工具对比:
- apt:系统级包管理,主要装系统软件和 C/C++ 库
- pip:Python 包管理,只针对 Python,依赖解析相对薄弱
- conda:
- 可以同时管理:Python/R/Julia + C 库 + 各种工具(git、ffmpeg 等)
- 自带 虚拟环境 概念(多套 Python 共存、互不干扰)
- 尽量通过预编译二进制包,减轻"编译失败""缺少系统库"的痛苦
你可以把每个 conda 环境想成是:
一个轻量的"用户级小系统"(有自己的 Python、库、Python 包等)。
1. 安装与基础配置
1.1 安装方式选择
常见三种:
-
Anaconda
- 带一大堆科学计算包(numpy、pandas、jupyter 等)
- 适合"我要一键装齐数据科学环境",但体积大
-
Miniconda(推荐)
- 只带 Python + conda,不预装第三方库
- 适合希望"从零按需装包"的用户
-
(Mamba)Mambaforge / Miniforge
- 自带更快的求解器
mamba,默认用conda-forge源 - 对包更新速度要求高、对性能敏感时非常适合
- 自带更快的求解器
如果你不确定,首选 Miniconda 或 Mambaforge。
1.2 环境变量与初始化
安装完成后,一般会提示你运行类似:
bash
# Linux / macOS
conda init bash
# 或 zsh/fish 等
这一步作用:
- 修改你的 shell 配置(如
~/.bashrc),在启动终端时自动注入 conda 的 hook - 以便你可以直接用
conda activate xxx,而不用手工搞 PATH
确认是否成功:
bash
conda --version
能输出版本号就说明 PATH 和 shell 初始化没问题。
2. 环境管理:把「环境」当作核心资产
2.1 创建环境
通用命令:
bash
conda create -n <环境名> [包1 包2 ...] [python=版本]
示例:
bash
# 创建一个 Python 3.11 的干净环境
conda create -n py311 python=3.11
# 数据科学环境,顺便装几个包
conda create -n ds python=3.11 numpy pandas matplotlib scikit-learn jupyterlab
要点:
- 不指定 python 时,会用默认版本(通常是安装时的主版本)
- 推荐每个项目一个环境,名字易懂,如
web-fastapi,ml-nlp,tf-2.15等
2.2 激活 / 退出环境
bash
# 激活
conda activate ds
# 当前 shell 前缀会变成 (ds)
# 此时 python/pip/conda 都是该环境下的
# 离开环境(回到上一个)
conda deactivate
你可以嵌套使用:
- 如果当前在
proj1环境,conda activate proj2会直接切换到 proj2 conda deactivate会回到系统默认(通常是 base)
2.3 查看 / 删除环境
bash
# 查看所有环境
conda env list
# 或
conda info --envs
删除:
bash
conda remove -n ds --all
--all 表示把整个环境删掉(目录 + 包)。
2.4 环境存放位置
默认位置通常在:
text
<conda安装目录>/envs/<环境名>
如:
text
/home/user/miniconda3/envs/ds
C:\Users\xxx\miniconda3\envs\ds
你可以通过:
bash
conda env list
来查看每个环境完整路径。
3. 包管理:conda install / update / remove / list / search
3.1 安装包(核心命令)
bash
# 先进入环境
conda activate ds
# 安装单个包
conda install numpy
# 安装多个包
conda install numpy pandas scipy
# 指定版本
conda install numpy=1.26
# 提前预览(不真正安装)
conda install numpy --dry-run
背后做的事情:
- 读取当前环境已有的包和版本
- 从配置的 channels 中查找满足条件的版本
- 给出"计划变更":要装什么、哪些会升级/降级
- 让你确认
Proceed ([y]/n)?
3.2 升级包 / 升级环境
bash
# 升级指定包
conda update numpy
# 升级所有包(慎用在生产环境)
conda update --all
update ≈ install 最新可用版本,conda 会尽力保持环境内依赖不冲突。
3.3 卸载包
bash
conda remove numpy
conda remove numpy pandas
如果其他包依赖被删的包,conda 会给你提示需要移除/变更哪些。
3.4 查看已安装包:conda list
bash
conda list
conda list numpy
重要信息:
- 包名 / 版本号
- build string
- 来自哪个 channel(如
conda-forge、defaults)
3.5 搜索包:conda search
bash
conda search numpy
conda search "numpy>=1.21"
- 能看到可用版本及其 channel
- 对于只想看"有没有这个包"时非常有用
补充:更多时候你会使用网页搜索(Anaconda.org / conda-forge),信息更全。
4. 通道(channels):就像 apt 源 + pip 源 混合体
4.1 概念
- channel = 包仓库(源)
- 安装包时,conda 会按照 channel 优先级依次查找
- 常见 channel:
defaults:Anaconda 官方conda-forge:社区维护,更新很快,包超多
4.2 查看当前 channel 配置
bash
conda config --show channels
4.3 修改 channel 优先级(推荐做法)
典型推荐配置:
bash
conda config--add channels conda-forge
conda config --set channel_priority strict
含义:
- 把
conda-forge加入 channels - 启用"严格优先级":
优先使用位于列表前面的 channel,避免不同 channel 混装导致的 ABI 问题
.condarc 中大致会变成:
yaml
channels:
- conda-forge
- defaults
channel_priority: strict
4.4 临时指定 channel
bash
conda install -c conda-forge matplotlib
这只影响本次安装。
4.5 国内镜像加速(如你在国内)
示例(以清华为例,具体以镜像站说明为准):
yaml
# ~/.condarc
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
- conda-forge
- defaults
show_channel_urls: true
设置完后:
bash
conda clean -i # 清理索引缓存,强制重新用新源
5. conda 与 pip 的正确"配合姿势"
5.1 核心原则(再强调一次)
在 conda 环境内:
能用 conda 装的就用 conda ;conda 仓库里没有的,再用
pip install。
原因:
- conda 自己管理一整套二进制栈(Python + 底层 C/Fortran 库)
pip install -U 某底层包可能会升级出一个 conda 未知的版本,破坏 ABI 兼容
5.2 标准流程示范
bash
conda create -n proj python=3.11
conda activate proj
# 1. 尽量用 conda 装
conda install numpy pandas scipy matplotlib
# 2. conda 没有的,用 pip
pip install some-rare-pypi-only-package
建议:
- 尽量不要用 pip 去升级那些 conda 装的核心库,如:
- numpy, scipy, pytorch, tensorflow, openssl 等
- 如果你确实要用 pip 升级这些核心包,思路最好是:
单独搞一个"pip-only 环境"(只用 pip,不用 conda 管包)
5.3 如何区分一个包是哪个工具装的?
conda list 的 channel 字段能看出:
pypi或pypi_0,通常表示通过 pip 安装记录的- 其他(如
conda-forge、defaults),是 conda 自己装的
6. 环境导出与迁移:environment.yml
对应 pip 的 requirements.txt,conda 使用 environment.yml 来描述"环境完整快照"。
6.1 导出环境
在目标环境中:
bash
conda activate proj
conda env export > environment.yml
生成的大致如下:
yaml
name: proj
channels:
- conda-forge
- defaults
dependencies:
- python=3.11
- numpy=1.26.4
- pandas=2.1.4
- pip
- pip:
- some-rare-pypi-only-package==0.3.1
要点:
- 记录了:
- 环境名
- 使用的 channels
- 所有 conda 包 + 版本
- pip 包列表
6.2 用 environment.yml 重建环境
在另一台机器 / 另一个账号:
bash
conda env create -f environment.yml
- 会自动创建一个名为
proj的环境(如文件里的name) - 想换名:
bash
conda env create -f environment.yml -n proj2
6.3 "精简版"导出
有时你不想锁死所有子依赖,只希望导出"顶层依赖"(类似手写 requirements.txt)。
可以手动删掉 environment.yml 里很多行,只保留自己关心的包 + 通道。
或者手动写一个简化版 yml,例如:
yaml
name: proj
channels:
- conda-forge
dependencies:
- python=3.11
- numpy
- pandas
- pip
- pip:
- some-rare-pypi-only-package
更利于在不同平台重建时有更大的自由度。
7. 进阶:多 Python / 多语言、C 库与工具
7.1 多个 Python 版本共存
bash
conda create -n py38 python=3.8
conda create -n py39 python=3.9
conda create -n py311 python=3.11
激活不同环境,就能轻松在 3.8 / 3.9 / 3.11 之间切换,而不动系统 Python。
7.2 管理非 Python 语言/工具
conda 能装的不只是 Python 包,例如:
bash
conda install -c conda-forge cmake
conda install -c conda-forge ffmpeg
conda install -c conda-forge git
R/julia 之类也可以(多数在 conda-forge 上有)。
这使得你可以用一个 conda 环境,统一打包:
- Python + 依赖
- 编译工具链
- 系统级库(如
libxml2,openssl等)
更适合作为"项目级运行时环境"。
8. 常见问题与排查思路
8.1 环境损坏 / 某些包 ImportError
现象:
- 某个 import 报错:找不到动态库 / symbol not found
- 很可能是 pip + conda 混用导致 ABI 不兼容
排查思路:
conda list看看该包来自哪(conda-forge? pypi?)- 如果是 pip 装在 conda 环境里的关键底层包(如 numpy, scipy),
可能是该 pip 版本不兼容当前环境里的底层库 - 成本最低的方案:
- 备份
environment.yml - 新建一个干净环境,按"先 conda 后 pip"原则重新创建
- 备份
8.2 求解速度慢
原因:
- 包多、channel 多
- 旧版 conda 依赖求解器慢
解决办法:
-
升级 conda:
bashconda update conda -
或者安装
mamba,使用 mamba 来代替部分命令:bashconda install -n base mamba -c conda-forge # 之后你可以这样用(几乎同语法) mamba install numpy pandas mamba create -n fastenv python=3.11 numpy
mamba 兼容大部分 conda 命令,用它装包明显更快。
8.3 base 环境过于混乱
常见坏习惯:
- 所有东西都往
base里装,一两年之后 base 环境变成"垃圾场"。
建议:
- 把 base 当成"系统管理环境",只做:
- 更新 conda / mamba
- 创建/删除环境
- 项目依赖一律新建环境,不往 base 塞东西
如果 base 已经很乱:
- 如果没有硬性依赖,可以考虑直接重装 Miniconda(最干净)
- 或者新装一份 Miniconda/Mambaforge 到另一个路径,用新的那份 conda 管今后的项目
9. 命令速查:适合贴在桌边的小抄
9.1 环境
bash
# 创建环境
conda create -n myenv python=3.11
conda create -n ds python=3.11 numpy pandas jupyterlab
# 激活 / 退出
conda activate myenv
conda deactivate
# 查看所有环境
conda env list
conda info --envs
# 删除环境
conda remove -n myenv --all
9.2 包管理
bash
# 安装
conda install numpy
conda install numpy pandas
conda install numpy=1.26
# 指定 channel
conda install -c conda-forge numpy
# 升级
conda update numpy
conda update --all
# 卸载
conda remove numpy
# 查看包
conda list
conda list numpy
# 搜索包
conda search numpy
9.3 环境导出 / 迁移
bash
# 导出
conda activate myenv
conda env export > environment.yml
# 从 yml 创建
conda env create -f environment.yml
conda env create -f environment.yml -n newname
9.4 配置 channels
bash
# 查看 channels
conda config --show channels
# 添加 conda-forge 并启用严格优先
conda config --add channels conda-forge
conda config --set channel_priority strict