4. 包管理基础:安装、更新与卸载

好了,到了我们真正上手操作的时候了。

Conda 最核心的功能,说白了就是管包。装包、卸包、更新包,这三板斧要是玩熟了,后面搭建环境基本就是行云流水。我个人习惯把这部分叫做“包管理的日常三件事”,咱们一个一个来拆解。

4.1 安装包(install)

安装是用的最多的命令,没有之一。

最基本的用法就是 conda install 包名。假设你想装个 numpy,直接敲:

conda install numpy

它会自动去默认的 defaults 频道找,然后下载最新的稳定版。

但我建议你养成一个好习惯:安装的时候指定频道。为什么呢?因为有些包在默认频道里版本太旧,或者压根没有。

小窍门: 指定频道安装,能避免很多版本冲突。

举个例子,装 pytorch 就得去 pytorch 频道:

conda install pytorch torchvision torchaudio -c pytorch

这里的 -c 就是 --channel 的缩写,指定源。

还有一种情况,你需要装一个特定版本。比如项目 A 依赖 pandas 1.3.0,项目 B 依赖 1.4.0。怎么装?

conda install pandas=1.3.0
conda install pandas==1.4.0

这两个写法都可以。我一般用 =,因为敲起来更快。你也可以同时装多个包:

conda install numpy scipy matplotlib

这一下就把科学计算三件套全装上了。

4.2 更新包(update)

更新操作也很简单。Conda 提供了两个常用命令:update 和 upgrade。它们其实是同义词,用哪个都一样。

更新单个包:

conda update numpy

更新所有包(慎用,可能导致依赖大变):

conda update --all
特别注意: 更新所有包可能会引起依赖冲突。我曾经在一个大数据项目中执行了 conda update --all,结果把 Spark 的依赖搞崩了。建议只更新你需要升级的单个包。

更新的时候也能指定频道:

conda update numpy -c conda-forge

这样就是从 conda-forge 频道更新,而不是默认频道。

4.3 卸载包(remove)

有装就有卸。不用的包留着占空间,还可能造成冲突。

卸载单个包:

conda remove numpy

注意,这个命令只移除 numpy 本身,但它的依赖包不会自动清理。如果你想把依赖也一起干掉,加上 --all 参数是不行的(remove 没有 --all),正确的做法是直接把包名写全。

多个包一起卸:

conda remove numpy scipy matplotlib

批量操作,一步到位。

还有一种情况,你装了一个包,但发现版本不对,想重装。很多人会先卸再装,其实有更聪明的方法:

conda install --force-reinstall numpy

这命令会强制重装,哪怕当前版本和目标版本一样。我在调试环境问题时经常用这招。

4.4 指定版本和渠道

这部分是包管理的精髓。你想想看,一个项目可能依赖旧版 numpy,另一个项目要新版。怎么共存?靠环境隔离 + 版本指定。

操作 命令示例 说明
安装指定版本 conda install numpy=1.19.5 从默认频道安装 1.19.5
从指定频道安装 conda install numpy -c conda-forge 从 conda-forge 频道获取
频道+版本同时指定 conda install numpy=1.19.5 -c conda-forge 优先从指定频道找该版本
版本范围 conda install "numpy>=1.18,<1.20" 安装 1.18 到 1.19.x 之间的版本

这里有个小坑:版本号写法是 包名=版本号,而不是 ==。很多从 pip 转过来的同学容易搞混。

# 正确
conda install numpy=1.19.5

# 错误(虽然 conda 也兼容,但不推荐)
conda install numpy==1.19.5

为什么推荐 =?因为 conda 内部解析就是基于 = 的,写 == 虽然也能工作,但不够规范。

核心原则: 版本号尽量精确。不要写 numpy>=1.19 这种模糊约束,很容易装到不兼容的版本。我见过太多因为版本范围太宽导致环境炸裂的案例。

4.5 综合流程图

我把整个包管理核心逻辑画成了图,方便你理解:

包管理核心流程图 用户需求 操作类型? 安装 (install) 更新 (update) 卸载 (remove) 指定版本: numpy=1.19.5 指定频道: -c conda-forge 强制重装: --force-reinstall 环境更新完成 版本范围写法 "numpy>=1.18,<1.20" 多包: 空格分隔

怎么样,这张图是不是把流程说清楚了?从你的需求出发,根据操作类型走不同的处理路线,最后都指向环境更新完成。

4.6 避坑指南

最后,我说几个我踩过的坑。

坑一:装包时忘记激活环境

很多新手在新环境里执行 conda install,结果包装到了 base 环境。为什么?因为当前环境不是你的目标环境。记得先 conda activate myenv 再安装。

坑二:版本冲突全靠手动解决

我曾经遇到过装 A 包时要求 pandas<1.2,装 B 包时要求 pandas>=1.3。conda 其实会自动解决,但如果你同时装最好把两个包写在一行:

conda install a b

这样 conda 会统一做依赖解析,而不是分两次装。

坑三:卸载后残留依赖

我有个血泪教训:卸载了 numpy,但 scipy 还活着,结果 scipy 运行报错。记住,卸载包不会自动卸掉它的依赖。想彻底清理,得用 conda clean --all 配合使用。

经验之谈: 如果你的环境变“脏”了(很多包版本混杂),重建一个新环境往往比手动修效率高。记住:conda create -n fresh_env python=3.9,然后重新装包。

好了,包管理的基础操作就这些。装、卸、改,再加上版本和频道的指定,你已经能应对绝大多数场景了。