pip install 与 conda install 的区别
结论:
- 在没激活任何 conda 环境时,
pip install装到哪取决于当前 shell 里pip指向的 Python(往往是系统 Python 或 conda base);激活别的环境后,这些包默认看不见。 - 在 conda 环境中,
pip与pip3没有任何区别,二者功能完全一致。 - 在 conda 环境里,
pip install仅把包扔进本环境的 site-packages,而conda install会跨语言、跨库做整体依赖解析和 ABI 一致性校验,并可随时用conda remove/conda list --revisions回滚。 - 因此最佳实践是:先
conda install解决底层/科学计算依赖,再对 PyPI-only 的包用pip install,最后用conda env export或conda list --explicit锁定可复现环境。
以上结论得出过程,请见以下与 Kimi 的对话。
问1:
系统里安装了conda,但当前没有activate任何一个conda环境,现在,我使用pip安装python软件包,请问这个软件包安装到了哪里?
如果后续我ctivate了conda环境,在conda环境中,我可以使用这些通过pip安装的软件包吗?
答1:
先把两个问题拆开回答:
1️⃣ 没有激活任何 conda 环境时,pip install 会把包装到哪?
-
取决于 当前 shell 里
pip指向的可执行文件 是谁。
运行:which pip # 或 which pip3常见结果与含义:
which pip 的输出 实际安装位置(Linux 示例) /usr/bin/pip3系统级 Python: /usr/lib/python3.x/site-packages$HOME/.local/bin/pip“用户级” Python: $HOME/.local/lib/python3.x/site-packages/opt/conda/bin/pipconda base 环境的 site-packages(如果你把 conda 的 base 设为默认)➡️ 结论:只要没激活任何环境,装到 系统 Python 还是 conda base,取决于 PATH 顺序。
几乎不会装到“某个还没激活的环境”里去。
2️⃣ 之后激活某个 conda 环境,能否用到之前装的包?
-
不能直接使用。
conda 环境有自己独立的site-packages目录,PATH、PYTHONPATH也都会切换。
之前装到系统或 base 环境里的包在新环境里 默认不可见。 -
如果想用,可以:
- 在目标环境里重新装:
conda activate myenv && pip install package - 或者把旧路径临时加到
PYTHONPATH(不推荐,容易冲突)。
- 在目标环境里重新装:
✅ 一句话总结
没激活任何 conda 环境时,
pip install装到哪个 Python 就取决于当前 PATH;激活 conda 环境后,那些包默认用不到,得在目标环境里再装一遍。
问2:
根据如下内容,请问,为什么看起来pip和pip3是同一个东西?
ubuntu@ubuntu:~$ conda activate rl
(rl) ubuntu@ubuntu:~$ which pip
/home/ubuntu/miniconda3/envs/rl/bin/pip
(rl) ubuntu@ubuntu:~$ which pip3
/home/ubuntu/miniconda3/envs/rl/bin/pip3
(rl) ubuntu@ubuntu:~$ pip --version
pip 25.1.1 from /home/ubuntu/miniconda3/envs/rl/lib/python3.12/site-packages/pip (python 3.12)
(rl) ubuntu@ubuntu:~$ pip3 --version
pip 25.1.1 from /home/ubuntu/miniconda3/envs/rl/lib/python3.12/site-packages/pip (python 3.12)
答2:
在 当前这个 conda 环境(rl) 里,pip 和 pip3 实际上指向同一个可执行文件,只是名字不同:
which pip→/home/ubuntu/miniconda3/envs/rl/bin/pipwhich pip3→/home/ubuntu/miniconda3/envs/rl/bin/pip3
这两个文件在 conda 环境里是 软链接(symlink) 到同一个入口脚本,内容也完全一样:
ls -l /home/ubuntu/miniconda3/envs/rl/bin/pip*
# 会看到类似:
# pip -> pip3
# pip3 -> pip3.12
# pip3.12 是一个 Python 入口脚本
✅ 为什么要有 pip 和 pip3 两个名字?
-
历史兼容:
在系统 Python 里,Python 2 时代用pip,Python 3 用pip3区分。
但现在大多数环境默认就是 Python 3,所以pip也就直接指向 Python 3 的 pip。 -
conda 环境隔离:
每个环境只对应一个 Python 版本(这里是 3.12),所以不需要再区分 pip2/pip3,直接pip install就够了。
✅ 一句话总结
在 conda 环境里,
pip和pip3是同一个东西,只是名字不同,完全等价。
用哪个都一样,推荐用pip更简洁。
问3:
根据你的描述,pip 和 pip3 实际上指向同一个可执行文件,但实际并不是这样,它们是两个不同的文件。
这是怎么回事?
(rl) ubuntu@ubuntu:~$ ls -l /home/ubuntu/miniconda3/envs/rl/bin/pip*
-rwxrwxr-x 1 ubuntu ubuntu 254 5月 26 11:17 /home/ubuntu/miniconda3/envs/rl/bin/pip
-rwxrwxr-x 1 ubuntu ubuntu 254 5月 26 11:17 /home/ubuntu/miniconda3/envs/rl/bin/pip3
答3:
你看到的输出其实 不是软链接,而是两个普通可执行脚本(名字都叫 pip 和 pip3):
-rwxrwxr-x 1 ubuntu ubuntu 254 5月 26 11:17 /home/ubuntu/miniconda3/envs/rl/bin/pip
-rwxrwxr-x 1 ubuntu ubuntu 254 5月 26 11:17 /home/ubuntu/miniconda3/envs/rl/bin/pip3
这两个文件是 conda 在安装该环境时自动生成的入口脚本,内容几乎一样,都是:
#!/home/ubuntu/miniconda3/envs/rl/bin/python3.12
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
✅ 所以结论是:
- 它们不是软链接,但功能完全一致,都调用的是当前 conda 环境(Python 3.12)里的 pip。
- 你可以理解为:conda 为了兼容旧习惯,保留了
pip3这个名字,但本质上它和pip是一样的。
🔍 想验证内容是否一样?
可以运行:
diff /home/ubuntu/miniconda3/envs/rl/bin/pip /home/ubuntu/miniconda3/envs/rl/bin/pip3
如果没有输出,说明文件内容完全一致。
问4:
确实如你所说,这两个文件没有任何差别。
还有一个问题,在conda环境中,使用pip安装软件包和使用conda install安装软件包有什么区别?
答4:
一句话先总结:
在 conda 环境里用
pip install只是 把包塞进这个环境的 site-packages,而conda install不仅装包,还会 在整个 conda 生态里做严格的依赖解析、版本锁定、二进制兼容检查,并在需要时降级/升级你环境中的其它 conda 包。
下面分点展开:
| 维度 | pip install | conda install |
|---|---|---|
| 包来源 | PyPI(Python-only 或带 wheel 的二进制) | Anaconda 官方/conda-forge 等 channel(多为完整二进制发行版) |
| 依赖解析范围 | 只看 Python 依赖(install_requires);对系统 C/Fortran/R 库、CUDA、MKL 等 不管 |
跨语言、跨库统一解析;会把 numpy-base, libgcc, openssl, cuda-toolkit … 都考虑进去 |
| 冲突处理 | 遇到版本冲突时直接覆盖或留下双版本,容易出现 “DLL not found” 或 ABI 不兼容 | 发现冲突会给出方案(降级/升级/替换),装不上就报错,保持环境一致性 |
| 二进制兼容性 | 依赖系统已有的动态库,容易 “这台机器能跑、那台机器挂” | 所有二进制在 CI 里用同一套编译链 + 固定 ABI 打包,跨机器一致性高 |
| 卸载/回滚 | pip uninstall 只能卸 pip 装的包,可能留下孤儿文件 |
conda remove / conda install --revision 可以把整个环境回滚到上一个 transaction |
| 速度/镜像 | 国内 PyPI 镜像很多,下载快 | 国内清华、中科大、conda-forge 镜像也不错,但首次解析索引稍慢 |
| 适用场景 | ① PyPI 独有包;② 开发阶段频繁迭代;③ 纯 Python 包 | ① 科学计算全家桶(numpy, pytorch, tensorflow…);② 需要 MKL/CUDA;③ 生产环境需高一致性 |
实际建议
-
优先 conda:
装 “科学计算/深度学习” 全家桶时,先用 conda 解决底层依赖,例如conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia -
conda 找不到再 pip:
某些包只在 PyPI 发布(如yfinance,tushare):pip install yfinance -
混用顺序:
先 conda → 后 pip;不要反过来,否则 conda 的依赖解析会被 pip “破坏”。 -
锁定环境:
最终用conda env export > environment.yml或conda list --explicit > spec.txt记录,保证可复现。
彩蛋:一个常见误区
“我在 conda 环境里
pip install tensorflow,结果 import 报错找不到 libcublas.so”
原因就是 pip 装的 wheel 依赖系统 CUDA,而 conda 环境里没有对应版本。改用
conda install tensorflow-gpu
conda 会一次性把 cudatoolkit、cudnn、tensorflow 全部配好。
总结:
再看一遍结论,小本本记下来!

- 在没激活任何 conda 环境时,
pip install装到哪取决于当前 shell 里pip指向的 Python(往往是系统 Python 或 conda base);激活别的环境后,这些包默认看不见。 - 在 conda 环境中,
pip与pip3没有任何区别,二者功能完全一致。 - 在 conda 环境里,
pip install仅把包扔进本环境的 site-packages,而conda install会跨语言、跨库做整体依赖解析和 ABI 一致性校验,并可随时用conda remove/conda list --revisions回滚。 - 因此最佳实践是:先
conda install解决底层/科学计算依赖,再对 PyPI-only 的包用pip install,最后用conda env export或conda list --explicit锁定可复现环境。

浙公网安备 33010602011771号