混用 Conda 和 Pip 确实是 Python 环境管理中的大忌,尤其是在 Windows 上搞深度学习开发时。
以下是为什么尽量不要混用 ,以及如果必须混用该遵循什么原则的详细解释:
1. 为什么它们会"打架"?(底层原理)
虽然它们最终都把文件放在 site-packages 文件夹里,但它们的**管理逻辑(记账方式)**完全不同:
-
Conda (像是房屋的"大管家"):
-
管理范围大: 它不仅管 Python 包,还管非 Python 的依赖(如 C++ 库、DLL 文件、CUDA 驱动接口、MKL 数学库)。
-
严格记账: 它在
conda-meta文件夹里有一本严格的账本。它安装包时,会检查所有依赖的二进制兼容性(Hard-link)。 -
结构: 它倾向于安装经过编译优化的二进制包。
-
-
Pip (像是送快递的"临时工"):
-
只管 Python: 它主要从 PyPI 下载
whl包或源码,解压到site-packages。 -
甚至不看 Conda 的账本: Pip 安装时,通常不会去通知 Conda。
-
盲目覆盖: 如果 Conda 已经装了一个
numpy,你又用 Pip 装了一个。Pip 可能会直接把旧文件覆盖掉,或者删掉一部分。
-
结果: Conda 的账本上写着"我有 NumPy",但实际上文件已经被 Pip 换成别的版本了。当你下次用 conda remove 或 pip uninstall 时,两边都找不到对应的"收据"(RECORD file),就会报错。
2. 什么时候最容易出问题?
最灾难性的场景就是**"反复横跳"**:
-
用 Conda 装了 NumPy。
-
用 Pip 升级了 NumPy。
-
又用 Conda 装了另一个依赖 NumPy 的包(Conda 发现版本不对,试图强制降级 NumPy)。
-
BOOM! 环境彻底损坏,元数据丢失。
3. 现代数据科学的最佳实践(Golden Rules)
既然完全不混用在现实中很难(因为很多新论文的代码只有 pip 包,没有 conda 包),建议遵循以下 "单向流动"原则:
✅ 黄金法则 1:Conda 用于"地基",Pip 用于"装修"
-
用 Conda 安装核心环境:
-
Python 解释器 (
conda create -n myenv python=3.10) -
重型底层库(如
cudatoolkit,cudnn,如果不包含在 torch 里的话)
-
-
用 Pip 安装剩余所有 Python 包:
-
pytorch,tensorflow,pandas,numpy,scikit-learn等。 -
理由: 现在的 PyTorch 和 TensorFlow 官方推荐的安装命令其实主要是 Pip。Pip 源的包更新最快,且在 Python 环境内兼容性最好。
-
✅ 黄金法则 2:一旦开始用 Pip,就别回头用 Conda
在一个环境中,一旦你执行了第一次 pip install,之后所有的包管理最好都只用 pip。不要再运行 conda install,否则 Conda 可能会试图重新梳理依赖关系,把 Pip 装好的包搞坏。
✅ 黄金法则 3:纯净模式(推荐)
最稳健的做法其实是:
-
conda create -n myenv python=3.10(只让 Conda 提供 Python) -
conda activate myenv -
pip install ...(所有的库全用 pip 装)
这样 Conda 只负责切换 Python 版本,包管理全权交给 Pip,完全避免了冲突。