Conda与pip在安装Python库时的区别与选择
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可以直接把编译好的版本连同底层库一起装好,用户不必自己配置编译环境。
二、核心区别详解
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安装的所有包都是预编译好的二进制文件,不需要本地编译环境。下载即用,安装速度和成功率通常更高。
三、关键差异汇总
| 对比维度 | pip | Conda |
|---|---|---|
| 包来源 | PyPI(50万+项目) | defaults / conda-forge(数万包) |
| 管理范围 | 仅Python包 | Python包 + 非Python依赖 + Python解释器 |
| 依赖解析 | Python层依赖 | 全栈依赖(含C库、系统库) |
| 安装方式 | wheel或本地编译 | 预编译二进制 |
| 环境管理 | 需配合venv/virtualenv | 内置conda环境管理 |
| Python版本 | 使用系统已安装的版本 | 可在环境中指定任意版本 |
| 跨平台 | 依赖系统编译环境 | 各平台预编译,一致性好 |
| 速度 | 纯Python包较快 | 依赖解析可能较慢(mamba可加速) |
四、在不同场景中如何选择
适合用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 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吗?
可以。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,更轻量、更干净。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













