环境管理—Conda
conda
Conda 简介
Conda 是一个 包管理器 和 环境管理器。
它主要有两个作用:
1
2
1. 安装软件包
2. 管理隔离环境
Conda 不只适用于 Python,也可以管理 C/C++ 库、构建工具和其他可执行程序。
例如可以安装:
1
2
3
4
5
6
7
8
9
10
11
12
13
python
numpy
scipy
pytorch
cmake
ninja
gcc
clang
eigen
boost
opencv
pcl
assimp
因此 Conda 常用于:
- Python 科学计算
- 机器学习
- C++ / Python 混合项目
- CMake 项目
- 机器人开发
- 跨平台开发环境管理
Conda 主要解决的问题
不同项目可能需要不同版本的软件包。
例如:
1
2
project_a 需要 Python 3.8 + NumPy 1.x
project_b 需要 Python 3.12 + NumPy 2.x
如果都安装到系统环境中,就容易发生版本冲突。
Conda 的解决方式是:为每个项目创建一个独立环境。
例如:
1
2
conda create -n project_a python=3.8 numpy
conda create -n project_b python=3.12 numpy
使用时切换环境:
1
conda activate project_a
或:
1
conda activate project_b
这样不同项目之间的依赖互不影响。
Conda 的核心概念
Conda 中常见的几个核心概念如下:
| 概念 | 含义 |
|---|---|
| environment | 环境,一个隔离的软件目录 |
| package | 软件包,可以是 Python 包,也可以是 C/C++ 库或工具 |
| channel | 包源,Conda 从这里下载软件包 |
| solver | 依赖求解器,用来计算兼容的软件包版本 |
| environment.yml | 环境配置文件,用于记录环境依赖 |
Conda 环境
Conda 环境是一个独立目录,里面有自己的:
- Python 解释器
- Python 包
- C/C++ 库
- 可执行程序
- 头文件
- 动态库
- 环境变量
创建环境:
1
conda create -n planner python=3.12
激活环境:
1
conda activate planner
查看当前 Python:
1
2
which python
python --version
退出环境:
1
conda deactivate
删除环境:
1
conda remove -n planner --all
Conda 环境目录
假设创建了一个环境:
1
conda create -n planner python=3.12 cmake eigen
Conda 可能会创建如下目录:
1
~/anaconda3/envs/planner/
或者:
1
~/miniconda3/envs/planner/
该目录中通常包含:
1
2
3
4
bin/
include/
lib/
share/
例如:
1
2
3
4
~/anaconda3/envs/planner/bin/python
~/anaconda3/envs/planner/bin/cmake
~/anaconda3/envs/planner/include/
~/anaconda3/envs/planner/lib/
激活环境后:
1
conda activate planner
系统会优先使用该环境中的程序。
可以检查:
1
2
which python
which cmake
可能输出:
1
2
/home/yanziyu/anaconda3/envs/planner/bin/python
/home/yanziyu/anaconda3/envs/planner/bin/cmake
Conda 包
Conda 包可以是 Python 包,也可以是非 Python 包。
安装 Python 包:
1
conda install numpy scipy matplotlib
安装 C/C++ 相关包:
1
conda install cmake ninja eigen boost
安装图像和科学计算库:
1
conda install opencv pcl
Conda 和 pip 的重要区别是:
1
2
pip 主要管理 Python 包
conda 可以管理 Python 包、C/C++ 库、可执行程序和底层依赖
Conda Channel
Channel 是 Conda 下载软件包的来源。
常见 channel 有:
| Channel | 作用 |
|---|---|
defaults | Anaconda 官方默认包源 |
conda-forge | 社区维护的大型包源,包非常丰富 |
pytorch | PyTorch 官方相关包 |
nvidia | CUDA 相关包 |
robostack | ROS 相关 Conda 包 |
robostack-staging | ROS 包的 staging 源 |
添加 channel:
1
conda config --add channels conda-forge
查看 channel:
1
conda config --show channels
删除 channel:
1
conda config --remove channels conda-forge
统一使用 conda-forge
对于科学计算、C++、机器人开发项目,通常推荐尽量统一使用:
1
conda-forge
推荐配置:
1
2
conda config --add channels conda-forge
conda config --set channel_priority strict
如果想尽量只使用 conda-forge,可以删除 defaults:
1
conda config --remove channels defaults
检查配置:
1
2
conda config --show channels
conda config --show channel_priority
理想结果:
1
2
3
4
channels:
- conda-forge
channel_priority: strict
开启严格优先级的作用是:
1
优先从 conda-forge 中选择包和依赖,减少不同 channel 混用带来的二进制兼容问题。
不推荐在同一个环境中频繁混用:
1
2
3
4
defaults
conda-forge
pytorch
nvidia
因为容易导致底层依赖冲突,例如:
1
2
3
4
5
openssl
zlib
libstdc++
blas
lapack
Anaconda、Miniconda 和 Miniforge
Conda 是工具本身,而 Anaconda、Miniconda、Miniforge 是不同的发行版。
| 名称 | 含义 |
|---|---|
| Conda | 包管理器和环境管理器 |
| Anaconda | 包含 Conda 和大量预装科学计算包的完整发行版 |
| Miniconda | 轻量发行版,只包含 Conda 和基础组件 |
| Miniforge | 默认使用 conda-forge 的轻量发行版 |
Anaconda
Anaconda 体积较大,预装很多科学计算包,例如:
1
2
3
4
5
numpy
scipy
pandas
matplotlib
jupyter
适合初学者快速搭建科学计算环境。
Miniconda
Miniconda 比较轻量,只提供 Conda 和基础 Python。
需要什么包再手动安装。
Miniforge
Miniforge 默认使用 conda-forge。
对于 C++、CMake、机器人开发和科研项目,通常更推荐使用 Miniforge 或 Miniconda,而不是完整 Anaconda。
Conda 基本命令
查看 Conda 版本
1
conda --version
查看当前环境列表
1
conda info --envs
或者:
1
conda env list
当前激活的环境前面会有 *。
创建环境
1
conda create -n myenv python=3.12
创建环境并安装依赖:
1
conda create -n planner python=3.12 cmake ninja eigen
激活环境
1
conda activate planner
退出环境
1
conda deactivate
删除环境
1
conda remove -n planner --all
安装包
1
conda install numpy
指定 channel 安装:
1
conda install -c conda-forge eigen
安装多个包:
1
conda install cmake ninja eigen assimp
删除包
1
conda remove eigen
查看已安装包
1
conda list
搜索包
1
conda search eigen
更新包
1
conda update numpy
更新 Conda 自身
1
conda update conda
environment.yml 文件
environment.yml 用来记录 Conda 环境依赖。
它的作用类似于 Pixi 的 pixi.toml,但 Conda 没有 Pixi 那样的内置 task 系统。
示例:
1
2
3
4
5
6
7
8
9
10
name: planner
channels:
- conda-forge
dependencies:
- python=3.12
- cmake
- ninja
- eigen
- assimp
- numpy
根据文件创建环境:
1
conda env create -f environment.yml
更新已有环境:
1
conda env update -f environment.yml --prune
导出当前环境:
1
conda env export > environment.yml
更推荐导出手动安装的依赖:
1
conda env export --from-history > environment.yml
--from-history 的作用是:
1
只导出用户主动安装的依赖,而不是所有间接依赖。
这样生成的 environment.yml 更简洁,也更适合放入项目仓库。
Conda 和 pip 的关系
Conda 环境里可以使用 pip。
示例:
1
2
3
4
conda create -n pydev python=3.12
conda activate pydev
conda install numpy scipy
pip install some_python_package
推荐原则:
1
优先 conda,后 pip
也就是:
- 先用 Conda 安装 Python、NumPy、SciPy、PyTorch、OpenCV 等底层依赖复杂的包;
- 再用 pip 安装 Conda 中没有的纯 Python 包;
- 尽量不要用 Conda 和 pip 反复安装同一个大型包。
推荐:
1
2
conda install numpy scipy opencv
pip install some-pure-python-package
不推荐:
1
2
3
4
pip install numpy
conda install scipy
pip install opencv-python
conda install opencv
这样容易导致动态库或 ABI 冲突。
Conda 和 venv 的区别
venv 是 Python 自带的虚拟环境工具。
创建 venv:
1
2
3
python -m venv .venv
source .venv/bin/activate
pip install numpy
Conda 和 venv 的区别:
| 对比项 | Conda | venv |
|---|---|---|
| 管理 Python 版本 | 支持 | 通常依赖系统已有 Python |
| 管理 Python 包 | 支持 | 通过 pip 支持 |
| 管理 C/C++ 库 | 支持 | 不擅长 |
| 管理可执行程序 | 支持 | 不擅长 |
| 适合科学计算 | 很适合 | 一般 |
| 适合 C++ 混合项目 | 较适合 | 不适合 |
| 环境隔离 | 支持 | 支持 |
如果项目只需要纯 Python,venv + pip 很轻量。
如果项目涉及:
1
2
3
4
5
6
7
8
numpy
scipy
pytorch
opencv
C++ 库
CMake
CUDA
机器人开发
Conda 更合适。
Conda 和 apt 的区别
| 对比项 | Conda | apt |
|---|---|---|
| 安装范围 | 用户级、环境级 | 系统级 |
| 是否需要 sudo | 通常不需要 | 通常需要 |
| 多版本共存 | 支持 | 不方便 |
| 跨平台 | Linux、Windows、macOS | 主要面向 Debian / Ubuntu |
| 适合 Python 科学计算 | 很适合 | 一般 |
| 适合系统驱动 | 不适合 | 适合 |
| 环境复现 | 较好 | 较弱 |
例如安装 CMake:
1
sudo apt install cmake
表示安装到系统环境。
1
conda install cmake
表示安装到当前 Conda 环境。
系统级内容仍然建议使用 apt,例如:
1
2
3
4
5
6
显卡驱动
内核模块
udev 规则
系统服务
USB 权限
CAN 配置
Conda 和 Mamba 的区别
Mamba 可以理解为 Conda 的高速实现,尤其是依赖解析更快。
| 对比项 | Conda | Mamba |
|---|---|---|
| 作用 | 包管理、环境管理 | 包管理、环境管理 |
| 包格式 | Conda 包 | Conda 包 |
| 命令风格 | conda install | mamba install |
| 依赖解析速度 | 较慢 | 通常更快 |
| 生态 | 官方传统工具 | 社区常用高性能工具 |
很多命令可以直接替换。
Conda:
1
conda install numpy
Mamba:
1
mamba install numpy
创建环境:
1
mamba create -n planner python=3.12 cmake ninja
如果觉得 Conda 安装依赖较慢,可以考虑使用 Mamba。
Conda 和 Pixi 的区别
Pixi 和 Conda 都使用 Conda 包生态,但管理方式不同。
| 对比项 | Conda | Pixi |
|---|---|---|
| 环境组织方式 | 以命名环境为中心 | 以项目目录为中心 |
| 配置文件 | environment.yml | pixi.toml |
| 锁文件 | 原生体验较弱 | 原生支持 pixi.lock |
| 任务系统 | 没有内置 task | 内置 [tasks] |
| 使用体验 | 手动创建、激活环境 | 更偏项目自动化 |
| 适合场景 | 交互式开发、通用环境 | 项目复现、团队协作、CI |
Conda 常见流程:
1
2
3
conda create -n planner python=3.12 cmake eigen
conda activate planner
conda install assimp
Pixi 常见流程:
1
2
3
pixi init
pixi add python cmake eigen assimp
pixi run build
可以简单理解为:
1
2
Conda 更像环境管理器
Pixi 更像项目环境管理器
Conda 在 CMake / C++ 项目中的使用
假设 C++ 项目需要:
1
2
3
4
5
cmake
ninja
eigen
assimp
boost
可以创建环境:
1
conda create -n cppdev -c conda-forge cmake ninja eigen assimp boost-cpp
激活环境:
1
conda activate cppdev
检查工具:
1
2
3
4
which cmake
cmake --version
which ninja
ninja --version
构建项目:
1
2
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)
如果 CMake 找不到库,可以检查当前 Conda 环境路径:
1
echo $CONDA_PREFIX
查找 CMake 配置文件:
1
find "$CONDA_PREFIX" -iname "*config.cmake"
例如:
1
2
find "$CONDA_PREFIX" -iname "*Eigen3Config.cmake"
find "$CONDA_PREFIX" -iname "*assimp*config*.cmake"
必要时手动指定 CMake 搜索路径:
1
2
3
4
cmake -S . -B build \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH="$CONDA_PREFIX"
find “$CONDA_PREFIX” -iname “*config.cmake” 的作用
这个命令用于:
1
在当前 Conda 环境中查找所有 CMake 配置文件。
命令如下:
1
find "$CONDA_PREFIX" -iname "*config.cmake"
其中:
| 部分 | 作用 |
|---|---|
find | Linux 文件查找命令 |
$CONDA_PREFIX | 当前激活的 Conda 环境路径 |
-iname | 按文件名查找,忽略大小写 |
*config.cmake | 匹配所有以 config.cmake 结尾的文件 |
该命令常用于排查:
- 某个库是否安装成功
- CMake 是否能找到该库
find_package(...)应该写什么名字CMAKE_PREFIX_PATH是否需要设置
例如查找 FCL:
1
find "$CONDA_PREFIX" -iname "*fcl*config*.cmake"
查找 Coal:
1
find "$CONDA_PREFIX" -iname "*coal*config*.cmake"
查找 Eigen:
1
find "$CONDA_PREFIX" -iname "*eigen*config.cmake"
Conda 在 Python 项目中的使用
创建 Python 环境:
1
conda create -n pydev python=3.12
激活环境:
1
conda activate pydev
安装常用库:
1
conda install numpy scipy matplotlib pandas jupyter
运行 Python:
1
python
查看当前解释器:
1
which python
导出环境:
1
conda env export --from-history > environment.yml
别人复现环境:
1
conda env create -f environment.yml
Conda 在 ROS 2 中的使用
Conda 本身不是 ROS 2 的官方 Ubuntu apt 安装方式,但通过 RoboStack,可以在 Conda 生态中安装 ROS 包。
常见 channel:
1
2
3
robostack
robostack-staging
conda-forge
一个 ROS 2 Humble 环境可以写成:
1
2
3
4
5
6
7
8
name: ros2
channels:
- robostack-staging
- conda-forge
dependencies:
- ros-humble-desktop
- colcon-common-extensions
- python=3.10
创建环境:
1
conda env create -f environment.yml
激活环境:
1
conda activate ros2
使用:
1
2
ros2 --help
colcon build
注意:
1
真实机器人硬件、驱动、udev、内核模块等仍然更适合用系统 apt 管理。
推荐的 Conda 使用习惯
不要在 base 环境里装太多东西
base 环境建议只保留 Conda 自身和少量基础工具。
不推荐:
1
2
conda activate base
conda install numpy scipy pytorch opencv cmake
推荐:
1
2
conda create -n project_name python=3.12
conda activate project_name
一个项目一个环境
推荐每个项目创建独立环境。
例如:
1
2
conda create -n path_planner python=3.12 cmake ninja eigen
conda activate path_planner
不要多个项目共用一个复杂环境。
尽量统一 channel
推荐尽量使用:
1
conda-forge
并开启严格优先级:
1
conda config --set channel_priority strict
优先 Conda,后 pip
推荐:
1
2
conda install numpy scipy opencv
pip install pure-python-package
不推荐混乱交叉安装同一个大型包。
定期导出环境
推荐:
1
conda env export --from-history > environment.yml
然后把 environment.yml 放入项目仓库。
常见问题
conda 命令找不到
如果电脑上有:
1
/home/yanziyu/anaconda3
但执行:
1
conda --version
提示找不到命令,通常说明 Conda 没有加入 PATH,或者没有初始化 shell。
先检查:
1
ls /home/yanziyu/anaconda3/bin/conda
如果文件存在,可以直接执行:
1
/home/yanziyu/anaconda3/bin/conda --version
初始化 bash:
1
2
/home/yanziyu/anaconda3/bin/conda init bash
source ~/.bashrc
然后检查:
1
conda --version
为什么 conda install 很慢
常见原因是依赖解析复杂,或者 channel 混用较多。
可以尝试:
1
mamba install package_name
或者减少 channel 混用,并开启严格优先级:
1
conda config --set channel_priority strict
明明安装了库,CMake 还是找不到
先确认环境已经激活:
1
2
conda activate cppdev
echo $CONDA_PREFIX
查找 CMake 配置文件:
1
find "$CONDA_PREFIX" -iname "*config.cmake"
如果配置文件存在但 CMake 找不到,可以手动指定:
1
cmake -S . -B build -DCMAKE_PREFIX_PATH="$CONDA_PREFIX"
Conda 环境能不能提交到 Git
不要提交整个 Conda 环境目录。
不要提交:
1
~/anaconda3/envs/myenv/
应该提交:
1
environment.yml
别人用下面命令复现环境:
1
conda env create -f environment.yml
Conda 能不能代替 apt
不能完全代替。
Conda 适合管理:
1
2
3
4
5
Python
C/C++ 库
开发工具
科学计算包
项目依赖
apt 适合管理:
1
2
3
4
5
系统服务
驱动
内核模块
udev 规则
系统级库
总结
Conda 的核心作用是:
1
包管理 + 依赖管理 + 环境隔离
典型工作流程:
1
2
3
conda create -n myenv python=3.12
conda activate myenv
conda install numpy cmake eigen
对于 C++ / CMake / 机器人开发,Conda 适合管理:
1
2
3
4
5
6
7
8
9
10
Python
NumPy
CMake
Ninja
Eigen
Boost
OpenCV
PCL
Assimp
ROS 2 相关包
但对于系统级内容,例如:
1
2
3
4
5
显卡驱动
USB 权限
udev 规则
内核模块
系统服务
仍然应该使用系统包管理器,例如 Ubuntu 下的 apt。
简单对比:
1
2
3
Conda:适合管理项目开发环境
apt:适合管理系统环境
Pixi:更适合把 Conda 生态项目化、可复现化