pip install 与 conda install 的区别

结论:
  1. 在没激活任何 conda 环境时,pip install 装到哪取决于当前 shell 里 pip 指向的 Python(往往是系统 Python 或 conda base);激活别的环境后,这些包默认看不见。
  2. 在 conda 环境中,pippip3 没有任何区别,二者功能完全一致。
  3. 在 conda 环境里,pip install 仅把包扔进本环境的 site-packages,而 conda install 会跨语言、跨库做整体依赖解析和 ABI 一致性校验,并可随时用 conda remove/conda list --revisions 回滚。
  4. 因此最佳实践是:先 conda install 解决底层/科学计算依赖,再对 PyPI-only 的包用 pip install,最后用 conda env exportconda 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/pip conda base 环境的 site-packages(如果你把 conda 的 base 设为默认)

    ➡️ 结论:只要没激活任何环境,装到 系统 Python 还是 conda base,取决于 PATH 顺序。
    几乎不会装到“某个还没激活的环境”里去。


2️⃣ 之后激活某个 conda 环境,能否用到之前装的包?
  • 不能直接使用
    conda 环境有自己独立的 site-packages 目录,PATHPYTHONPATH 也都会切换。
    之前装到系统或 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) 里,pippip3 实际上指向同一个可执行文件,只是名字不同:

  • which pip/home/ubuntu/miniconda3/envs/rl/bin/pip
  • which 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 环境里,pippip3 是同一个东西,只是名字不同,完全等价。
用哪个都一样,推荐用 pip 更简洁。


问3:

根据你的描述,pippip3 实际上指向同一个可执行文件,但实际并不是这样,它们是两个不同的文件。
这是怎么回事?

(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:

你看到的输出其实 不是软链接,而是两个普通可执行脚本(名字都叫 pippip3):

-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;③ 生产环境需高一致性

实际建议
  1. 优先 conda
    装 “科学计算/深度学习” 全家桶时,先用 conda 解决底层依赖,例如

    conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
    
  2. conda 找不到再 pip
    某些包只在 PyPI 发布(如 yfinance, tushare):

    pip install yfinance
    
  3. 混用顺序
    先 conda → 后 pip;不要反过来,否则 conda 的依赖解析会被 pip “破坏”。

  4. 锁定环境
    最终用 conda env export > environment.ymlconda list --explicit > spec.txt 记录,保证可复现。


彩蛋:一个常见误区

“我在 conda 环境里 pip install tensorflow,结果 import 报错找不到 libcublas.so”
原因就是 pip 装的 wheel 依赖系统 CUDA,而 conda 环境里没有对应版本。改用

conda install tensorflow-gpu

conda 会一次性把 cudatoolkit、cudnn、tensorflow 全部配好。

总结:

再看一遍结论,小本本记下来!

webwxgetmsgimg

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