conda install和pip install本质不同:1.conda管理跨语言二进制包、内置环境隔离、强制依赖兼容;2.pip仅管理Python包、依赖手动处理、需配合venv;3.conda从Anaconda仓库安装预编译包,pip从PyPI下载wheel或源码编译。

conda 和 pip 在 Anaconda 环境中都能装 Python 包,但它们不是“换种写法的同一工具”——用错一个,轻则包装不上、版本冲突,重则环境崩溃、ImportError 反复出现。
你该用哪个,取决于你要装什么、在哪装、以及能不能接受手动擦屁股。
conda install 装的是预编译二进制包,pip install 常要现场编译
conda 从 defaults 或 conda-forge 渠道下载的是平台适配好的二进制包(比如 numpy-1.26.4-py39h1a85909_0 这种带哈希和平台标记的文件),直接解压到 anaconda3/pkgs/ 缓存目录,多个环境可复用。
pip 默认从 PyPI 下载 .whl(wheel)或 .tar.gz(sdist):
- 多数纯 Python 包走
.whl,快且稳定; - 但一旦遇到含 C 扩展的包(如
llvmlite、pyarrow、某些旧版scipy),pip就可能触发本地编译,要求你装好 Visual Studio Build Tools(Windows)或build-essential(Linux),否则报Failed building wheel for xxx。
常见踩坑点:
- 在没装编译工具的干净 Windows 机器上
pip install numba直接失败; -
conda install numba一行搞定,因为它早把编译好的二进制包塞进仓库了。
conda 管环境,pip 不管环境——只管当前 Python 的 site-packages
conda create -n myenv python=3.9 创建的环境,是完整隔离的:Python 解释器、DLL/SO、头文件、甚至 mkl 这类数学库都独立存放。
pip 没有 create 命令。它只能往当前激活的 Python 环境的 site-packages 里塞东西。
- 如果你
conda activate myenv后用pip install,它装进的是myenv; - 但如果你忘了
activate,或者在 base 环境下误操作,pip就会污染 base,甚至波及系统 Python(尤其当你用sudo pip install时)。
更隐蔽的问题:
-
conda知道自己装了哪些包,conda list能准确列出; - 但一旦你混用
pip,conda list会显示<pip></pip>标记,且后续conda update可能跳过这些包,导致依赖不一致。
包来源和覆盖范围根本不同:PyPI vs Anaconda 官方生态
pip 对应的是 PyPI —— 全球 Python 包总站,超 15 万个包,但质量参差:
- 有些包只有源码、无 wheel;
- 有些包长期不维护、依赖过时;
- 有些包名字相似但作者不同(比如
requests和requests-toolbelt),拼错就装错。
conda 主要走 defaults(Anaconda 官方)和 conda-forge(社区共建),约 1.5 万个包,特点是:
- 科学计算栈(
numpy、scipy、matplotlib、pytorch)全都有优化版(比如 Intel MKL 加速); - R、C++、Fortran 工具链也能装(
r-base、gcc、cmake); - 每个包附带明确的构建号、平台约束、依赖锁(
conda search pandas能看到几十个变体)。
关键差异:
-
pip install tensorflow装的是 CPU 版; -
conda install tensorflow默认装 GPU 版(如果 CUDA 环境就绪),且自动拉取匹配的cudatoolkit和cudnn。
混用时的铁律:先 conda,后 pip,且仅限 conda 没有的包
官方文档(conda-forge)明确建议:
- 所有基础科学计算包(
numpy、pandas、scikit-learn、pytorch)优先用conda install; - 如果某个包 conda 仓库里真没有(比如新发布的
langchain预发布版、小众工具poetry),再用pip install; - 绝对不要反过来:用
pip装完numpy,再用conda install scipy—— conda 会检测到冲突,强行重装numpy,导致 pip 装的版本被覆盖,你的项目突然崩。
实操提醒:
- 激活目标环境后再操作:
conda activate myenv; - 查包是否存在:
conda search -c conda-forge package_name; - 换源加速(国内用户必做):
conda config --add channels <a href="https://www.php.cn/link/266e3c74976fe48b49c4833f6c9f0d33">https://www.php.cn/link/266e3c74976fe48b49c4833f6c9f0d33</a>; - 装完检查一致性:
conda list | grep package_name,确认没出现<pip></pip>标记。
真正麻烦的从来不是“能不能装上”,而是“装上之后,下周为什么 import 报错”。底层机制差异决定了:选错工具,问题不会立刻爆发,但一定会在你最不想调试的时候,从依赖树深处钻出来。

















