文章

环境管理—Conda

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作用
defaultsAnaconda 官方默认包源
conda-forge社区维护的大型包源,包非常丰富
pytorchPyTorch 官方相关包
nvidiaCUDA 相关包
robostackROS 相关 Conda 包
robostack-stagingROS 包的 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

也就是:

  1. 先用 Conda 安装 Python、NumPy、SciPy、PyTorch、OpenCV 等底层依赖复杂的包;
  2. 再用 pip 安装 Conda 中没有的纯 Python 包;
  3. 尽量不要用 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 的区别:

对比项Condavenv
管理 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 的区别

对比项Condaapt
安装范围用户级、环境级系统级
是否需要 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 的高速实现,尤其是依赖解析更快。

对比项CondaMamba
作用包管理、环境管理包管理、环境管理
包格式Conda 包Conda 包
命令风格conda installmamba 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 包生态,但管理方式不同。

对比项CondaPixi
环境组织方式以命名环境为中心以项目目录为中心
配置文件environment.ymlpixi.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"

其中:

部分作用
findLinux 文件查找命令
$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 生态项目化、可复现化
本文由作者按照 CC BY 4.0 进行授权