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 综合流程图
我把整个包管理核心逻辑画成了图,方便你理解:
怎么样,这张图是不是把流程说清楚了?从你的需求出发,根据操作类型走不同的处理路线,最后都指向环境更新完成。
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,然后重新装包。
好了,包管理的基础操作就这些。装、卸、改,再加上版本和频道的指定,你已经能应对绝大多数场景了。