Conda与pip在安装Python库时的区别与选择

Owen
Owen
发布时间:2026-10-20 | 3人浏览过
原创

Conda和pip都能安装Python库,但它们的工作方式差异很大:pip是Python自带的包安装工具,从PyPI获取纯Python包或预编译wheel;Conda是一个跨语言的包与环境管理器,从Anaconda仓库或conda-forge获取包,并且能同时管理Python本身和C/C++等非Python依赖。理解这些差异,才能在不同项目中选对工具、减少安装问题。

一、pip与Conda各自做什么

pip

pip是Python官方推荐的包安装器,全称"pip installs packages"。它从PyPI(Python Package Index)下载并安装包。pip本身只关心Python包——它读取每个包声明的依赖列表,按顺序安装所需的Python包,但不负责安装系统级的C库、编译器或其他非Python组件。

# 用pip安装requests库
pip install requests

# 安装指定版本
pip install numpy==1.24.3

# 从requirements.txt批量安装
pip install -r requirements.txt

pip安装的包默认放在当前Python解释器对应的site-packages目录。如果不使用虚拟环境,多个项目会共享同一组包,容易产生版本冲突。因此pip通常配合venv或virtualenv来隔离环境。

Conda

Conda是Anaconda公司开发的开源包管理器和环境管理器,随Anaconda或Miniconda一起安装。它的设计目标是管理整个计算环境,包括Python解释器本身、Python包、以及C/Fortran库等非Python依赖。

# 用conda安装scikit-learn(会自动解决包括C库在内的所有依赖)
conda install scikit-learn

# 创建一个使用Python 3.11的独立环境
conda create -n myproject python=3.11

# 激活环境后再安装包
conda activate myproject
conda install pandas matplotlib

Conda的包是预编译的二进制文件,安装时不需要本地编译。这意味着像numpy、scipy这样依赖BLAS/LAPACK等底层数学库的包,Conda可以直接把编译好的版本连同底层库一起装好,用户不必自己配置编译环境。

Conda与pip在安装Python库时的区别与选择
图1:pip与Conda在包管理范围上的对比——pip专注Python层,Conda覆盖整个计算环境

二、核心区别详解

1. 依赖解析方式不同

这是两者最重要的差异。pip按照包的setup.py或pyproject.toml中声明的依赖,逐个下载安装Python包。如果某个Python包需要系统级C库(例如libffi、openssl),pip不会帮你安装这些库——你需要自己通过系统包管理器(apt、brew等)提前装好。

Conda的做法不同。Conda仓库中的每个包都完整声明了所有依赖,包括底层C/C++库。安装时,Conda的SAT求解器会把所有依赖放在一起计算,找到一组互相兼容的版本,然后一次性安装。这意味着:

  • 安装scipy时,Conda会自动装好它需要的BLAS实现(如OpenBLAS或MKL),而pip需要系统提前装好或依赖wheel中捆绑的版本
  • 安装cryptography时,Conda会带上匹配的OpenSSL版本,pip则依赖系统已有的OpenSSL

2. 包来源不同

pip默认从PyPI安装,PyPI拥有超过50万个项目,几乎涵盖所有公开发布的Python包。任何人都可以把包上传到PyPI。

Conda默认从Anaconda官方仓库(defaults频道)安装,包数量较少(约数千个),但每个包都经过测试和预编译。社区维护的conda-forge频道提供了更多包(约两万多个),覆盖大部分常用库。

# 使用conda-forge频道安装
conda install -c conda-forge some-package

# 或者将conda-forge设为默认频道
conda config --add channels conda-forge
conda config --set channel_priority strict

如果一个包只在PyPI上有,而conda仓库里没有,可以在Conda环境中用pip安装它。这是常见的混合用法,但有注意事项(后文说明)。

3. 环境管理方式不同

pip本身不管理环境,需要配合venv来创建隔离的Python环境。一个venv环境绑定到创建它时使用的Python版本,无法在环境内切换Python版本。

# pip + venv 的典型工作流
python3.11 -m venv myenv
source myenv/bin/activate    # macOS/Linux
pip install numpy pandas

Conda的环境管理是内置的。创建环境时可以指定任意Python版本(只要仓库中有),Conda会自动下载对应的Python解释器。不同环境可以使用不同版本的Python。

# Conda环境管理
conda create -n py39project python=3.9
conda create -n py312project python=3.12
conda activate py39project   # 切换到Python 3.9环境

4. 安装机制不同

pip在安装包时,如果该包没有适用于当前平台的预编译wheel,pip会下载源码并在本地编译。这时候就需要本地有合适的编译器和依赖库,否则安装失败。这在Windows上安装需要C扩展的包时尤其常见。

Conda安装的所有包都是预编译好的二进制文件,不需要本地编译环境。下载即用,安装速度和成功率通常更高。

Conda与pip在安装Python库时的区别与选择
图2:两种工具安装同一个包时的流程差异

三、关键差异汇总

对比维度pipConda
包来源PyPI(50万+项目)defaults / conda-forge(数万包)
管理范围仅Python包Python包 + 非Python依赖 + Python解释器
依赖解析Python层依赖全栈依赖(含C库、系统库)
安装方式wheel或本地编译预编译二进制
环境管理需配合venv/virtualenv内置conda环境管理
Python版本使用系统已安装的版本可在环境中指定任意版本
跨平台依赖系统编译环境各平台预编译,一致性好
速度纯Python包较快依赖解析可能较慢(mamba可加速)
Conda与pip在安装Python库时的区别与选择
图3:根据项目特征选择pip或Conda的决策路径

四、在不同场景中如何选择

适合用pip的场景

  • 纯Python项目:Web应用、脚本工具、API服务等主要使用纯Python包的项目,pip完全够用。配合venv和requirements.txt就能管理好依赖。
  • 需要PyPI上的最新包:新发布的包通常先出现在PyPI,conda仓库的更新会滞后几天到几周。
  • CI/CD和容器环境:Docker容器中通常使用pip,因为容器本身提供了隔离,pip体积小、安装快,requirements.txt格式简单明确。
  • 发布自己的Python包:如果你要把包发布到PyPI供他人安装,开发过程中用pip测试安装更直接。

适合用Conda的场景

  • 科学计算和数据分析:NumPy、SciPy、Pandas、scikit-learn、TensorFlow、PyTorch等科学计算库通常有复杂的C/Fortran依赖,Conda处理这些依赖更可靠。
  • 需要不同Python版本:如果你同时维护Python 3.9和3.12的项目,Conda可以为每个环境指定不同的Python版本。
  • Windows上安装C扩展包:Windows缺少开箱即用的C编译器,用pip编译安装经常失败。Conda的预编译包绕过了这个问题。
  • 团队协作的数据科学项目:environment.yml文件可以精确记录整个环境配置,包括Python版本和非Python依赖,其他成员可以一条命令重建。
# 导出Conda环境配置
conda env export > environment.yml

# 其他成员重建环境
conda env create -f environment.yml

五、混合使用pip和Conda的注意事项

实际工作中,经常需要在Conda环境里用pip安装conda仓库没有的包。这可以正常工作,但需要遵循几个原则来避免问题。

先conda后pip:创建环境时先用conda install装好能从conda仓库安装的包,最后再用pip install补充。如果反过来,后续的conda install可能覆盖pip安装的包,导致不一致。

# 推荐的混合安装顺序
conda create -n myenv python=3.11
conda activate myenv
conda install numpy pandas scikit-learn   # 先用conda装
pip install some-pypi-only-package        # 再用pip补充

不要交替使用:尽量避免在一个环境中反复交替使用conda和pip安装。每次用pip安装后再用conda安装,Conda可能不知道pip已经装了什么,依赖状态会变得混乱。

提示:如果Conda环境因混合安装变得不可靠,最稳妥的办法是用conda env export和pip freeze分别导出当前已安装的包列表,然后重新创建一个干净的环境,按照"先conda后pip"的顺序重新安装。

在environment.yml中记录pip依赖:Conda的environment.yml支持在其中声明需要用pip安装的包,这样可以用一个文件管理两种来源的依赖:

name: myproject
channels:
  - conda-forge
  - defaults
dependencies:
  - python=3.11
  - numpy=1.24
  - pandas
  - pip
  - pip:
    - some-pypi-only-package
    - another-pip-package==2.1.0

六、速度与磁盘空间

pip安装纯Python包很快,因为wheel文件体积小,解压即完成。但安装需要编译的包时(如没有对应wheel的情况),编译过程可能耗时几分钟。

Conda的依赖解析步骤在包数量多或频道多时可能很慢,一次conda install等待一两分钟并不少见。这是因为SAT求解器需要在所有候选版本中找到全局一致的解。可以通过使用mamba(Conda的C++重写版依赖求解器)显著加速:

# 安装mamba
conda install -c conda-forge mamba

# 用mamba替代conda命令(用法完全相同)
mamba install scipy

磁盘空间方面,Conda环境通常比pip+venv环境占用更多空间,因为Conda的包包含了完整的依赖链。一个包含常见数据科学库的Conda环境可能占用数GB空间。pip环境通常更紧凑,特别是只安装纯Python包时。

Conda与pip在安装Python库时的区别与选择
图4:pip与Conda各自适合的使用场景总结

七、常见问题

Conda环境中可以用pip吗?

可以。Conda环境中自带pip,直接运行pip install即可。但应遵循"先conda后pip"的原则,尽量减少交替使用。

pip安装的包Conda能看到吗?

运行conda list时,pip安装的包会显示在列表中,标记来源为pypi。但Conda的依赖求解器不会分析这些包的依赖关系,后续的conda install可能产生冲突。

两者安装的同一个包有区别吗?

Python代码本身通常相同,但底层链接的C库可能不同。例如,Conda安装的NumPy可能链接到MKL(Intel的数学核心库),而pip安装的版本可能链接到OpenBLAS。这会导致数值计算性能有差异,但计算结果在正常精度范围内一致。

Miniconda和Anaconda怎么选?

Anaconda包含Conda和数百个预装的科学计算包,安装后体积约3-5GB。Miniconda只包含Conda和基本依赖,体积约80MB,需要的包自己安装。如果你清楚需要哪些包,推荐用Miniconda,更轻量、更干净。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表