conda使用详细指南

Conda 实战指南(偏详细版)

0. 总体认识:conda 究竟解决什么问题?

一句话:

conda = 环境管理器(虚拟环境) + 包管理器(跨语言包),解决"依赖地狱 + 环境冲突"。

和你已经熟悉的工具对比:

  • apt:系统级包管理,主要装系统软件和 C/C++ 库
  • pip:Python 包管理,只针对 Python,依赖解析相对薄弱
  • conda:
    • 可以同时管理:Python/R/Julia + C 库 + 各种工具(git、ffmpeg 等)
    • 自带 虚拟环境 概念(多套 Python 共存、互不干扰)
    • 尽量通过预编译二进制包,减轻"编译失败""缺少系统库"的痛苦

你可以把每个 conda 环境想成是:

一个轻量的"用户级小系统"(有自己的 Python、库、Python 包等)。


1. 安装与基础配置

1.1 安装方式选择

常见三种:

  1. Anaconda

    • 带一大堆科学计算包(numpy、pandas、jupyter 等)
    • 适合"我要一键装齐数据科学环境",但体积大
  2. Miniconda(推荐)

    • 只带 Python + conda,不预装第三方库
    • 适合希望"从零按需装包"的用户
  3. (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.1 安装包(核心命令)

bash 复制代码
# 先进入环境
conda activate ds

# 安装单个包
conda install numpy

# 安装多个包
conda install numpy pandas scipy

# 指定版本
conda install numpy=1.26

# 提前预览(不真正安装)
conda install numpy --dry-run

背后做的事情:

  1. 读取当前环境已有的包和版本
  2. 从配置的 channels 中查找满足条件的版本
  3. 给出"计划变更":要装什么、哪些会升级/降级
  4. 让你确认 Proceed ([y]/n)?

3.2 升级包 / 升级环境

bash 复制代码
# 升级指定包
conda update numpy

# 升级所有包(慎用在生产环境)
conda update --all

updateinstall 最新可用版本,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-forgedefaults
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 listchannel 字段能看出:

  • pypipypi_0,通常表示通过 pip 安装记录的
  • 其他(如 conda-forgedefaults),是 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 不兼容

排查思路:

  1. conda list 看看该包来自哪(conda-forge? pypi?)
  2. 如果是 pip 装在 conda 环境里的关键底层包(如 numpy, scipy),
    可能是该 pip 版本不兼容当前环境里的底层库
  3. 成本最低的方案:
    • 备份 environment.yml
    • 新建一个干净环境,按"先 conda 后 pip"原则重新创建

8.2 求解速度慢

原因:

  • 包多、channel 多
  • 旧版 conda 依赖求解器慢

解决办法:

  1. 升级 conda:

    bash 复制代码
    conda update conda
  2. 或者安装 mamba,使用 mamba 来代替部分命令:

    bash 复制代码
    conda 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
相关推荐
Genevieve_xiao14 小时前
【conda】解决每次打开powershell报错无法加载文件(自启动conda脚本)的问题
conda
F_D_Z2 天前
anaconda search&anaconda show | conda 检索包资源安装指定版本包指定源安装命令package
conda
勇往直前plus2 天前
PyCharm 找不到包?Anaconda base 环境 pip 装到用户目录的排查与修复
ide·python·pycharm·conda·pip
liwulin05063 天前
【PYTHON】python venv创建虚拟环境,非conda
开发语言·python·conda
这个人懒得名字都没写4 天前
Python包管理新纪元:uv
python·conda·pip·uv
zgj_online5 天前
vscode的zsh终端,conda切换node环境不成功的解决方案
ide·vscode·conda
忘带键盘了5 天前
拷贝conda环境到另一个服务器
linux·服务器·conda
0x62696E6 天前
在conda虚拟环境中编译和运行ROS2
python·ubuntu·conda
sherlock_ye47 天前
‘jupyter‘ 不是内部或外部命令,也不是可运行的程序或批处理文件,最终解决方案!
ide·python·jupyter·conda