Conda 是什么?

先来个直白的定义。Conda 是一个跨平台的包管理器 + 环境管理器。听起来很唬人?其实说白了,它帮你管两件事:装软件 和 隔离环境。而且它不光能管 Python 包——我一开始也觉得奇怪,后来才发现 C/C++ 库、R 包、甚至命令行工具它都能管。

你可能用过 pip,也知道 virtualenv。Conda 跟它们有点像,但更「重」一些,也更「底层」一些。举个例子,我在项目里遇到一个坑:用 pip 装某个科学计算库,结果编译报错,说缺了 fortran 编译器。换成 conda 装,一条命令搞定——它连底层的 libblas、liblapack 都给你包了。

一句话总结:Conda = 包管理 + 环境管理,不限语言,自带二进制依赖。

Conda 与 pip + virtualenv 的对比

你看,很多人一上来就问:「有了 pip 为什么还要用 Conda?」我当年也这么想过。实际用下来,区别还是很明显的。我直接列个表,对比着看更清楚。

特性 Conda pip + virtualenv
适用范围 任何语言(Python、R、C++ 等) 仅 Python
底层依赖处理 自动处理非 Python 的二进制依赖 需要手动安装系统库,或依赖 wheel
环境隔离 内置 conda create,隔离级别为完整目录 virtualenv/venv,仅隔离 Python 站点包
软件来源 Anaconda 仓库 / conda-forge 等 channel PyPI
安装方式 二进制预编译包,无需编译 多为源码编译,部分提供 wheel
版本锁定 通过 environment.yml 实现可重复 requirements.txt + pip freeze

我个人的习惯是:如果项目只涉及纯 Python 包,用 pip + venv 完全够用。但一旦涉及到科学计算、GPU 驱动、编译依赖(比如 TensorFlow、PyTorch、OpenCV),我绝对用 Conda。有一次做 Docker 镜像,用 pip 装 OpenCV 折腾了半小时,换成 conda 一行搞定——它把 libjpeg、libpng 都带上了。

小技巧:你可以在 Conda 环境里继续用 pip,但反过来不行。Conda 是「老大」,它管理 pip 是安全的。

为什么可重复计算需要 Conda?

回到课程主题。可重复计算的核心是环境一致性。你写了一堆代码,两年后打开,发现 numpy 版本变了,结果不一样了——这种糟心事我遇到过好几次。

Conda 的好处是:你可以导出一个完整的 environment.yml 文件,里面记录了所有包的精确版本和来源 channel。别人拿到这个文件,conda env create -f environment.yml 就能复现一模一样的环境。甚至连 Python 版本、底层库版本都一模一样。

相比之下,pip freeze 只记录顶层包的版本,而且不包含非 Python 依赖。你换个系统,可能就跑不起来了。

# Conda 环境导出示例
name: myenv
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.10
  - numpy=1.24.3
  - scipy=1.9.3
  - pip
  - pip:
    - flask==2.3.2

嗯,就是这个文件。只要 channel 和版本号写清楚,环境就是可重复的。

Conda 的生态:Anaconda 与 Miniconda

安装 Conda 有两种主流选择:Anaconda 和 Miniconda。很多人搞混,我简单讲一下。

  • Anaconda:大而全。装完自带 1500+ 科学计算包,体积 3GB 左右。适合初学者或离线环境。
  • Miniconda:只含 Python 和 conda 核心,体积不到 100MB。需要什么包自己装。我推荐这种,更轻量。

注意:Anaconda 默认包含很多包,但很可能你用不到。而且大镜像推送到 Docker registry 很慢。我们后面做 Docker 镜像时,会用 Miniconda 作为基础。

除了这两个,还有 Miniforge——它是社区维护的,默认 channel 是 conda-forge,没有 Anaconda 的商用许可限制。如果公司政策严格,可以考虑它。

安装 Miniconda(推荐)

安装过程很简单。我以 Linux 为例(我们 Docker 环境也是 Linux)。

第一步,下载安装脚本。

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

第二步,运行安装脚本。

bash Miniconda3-latest-Linux-x86_64.sh

一路回车,最后选择「yes」初始化 conda。安装完记得重新打开终端或执行 source ~/.bashrc。

我的一点经验:安装时默认路径是 ~/miniconda3。如果你在 Docker 里安装,建议放在 /opt/conda,方便多用户共享。后面讲 Dockerfile 时会专门说。

检查是否安装成功:

conda --version

输出版本号就算成了。例如:

conda 23.10.0

验证 Conda 的基本操作

装好后,试试几个核心命令,熟悉一下。

查看当前环境列表:

conda env list

创建一个新环境:

conda create -n testenv python=3.10

激活环境:

conda activate testenv

安装包:

conda install numpy scipy

导出环境:

conda env export > environment.yml

这些命令之后会反复用到。现在先有个手感。

本章知识体系

下面这张图把本章的核心逻辑串起来了,你可以一眼看清楚 Conda 在整个可重复计算流程中的位置。

Conda 知识体系 Conda 包管理 环境管理 跨平台 二进制依赖 多语言支持 环境隔离 版本锁定 Linux/Win/Mac Docker 友好 核心要点 Conda 是连接代码与可重复计算环境的桥梁 Anaconda (大而全) Miniconda (轻量) Miniforge (社区版)

好了,Conda 是什么、和 pip 的区别、怎么安装,你已经清楚了。下节课我们会真正动手,用 Conda 创建一个可重复的计算环境,并把它导出成 environment.yml——这是 Docker 容器化的第一步。