pip对应Python 2,pip3对应Python 3,二者独立运行、互不兼容,分别安装包至各自解释器的site-packages目录,且PyPI新包普遍停止支持Python 2。

Python 2 和 Python 3 的包管理工具不是“版本升级关系”,而是彻底分家:pip 对应 Python 2,pip3 对应 Python 3——但更关键的是,它们底层依赖的 setuptools、distutils 行为已不同,且 PyPI 上绝大多数新包已停止支持 Python 2。
pip 和 pip3 是两个独立命令,不能混用
Linux/macOS 系统常预装 Python 2(带 pip),而 Python 3 需手动安装后才带 pip3。二者指向不同解释器的 site-packages 目录,互不感知:
-
pip install requests→ 装进 Python 2 的site-packages,Python 3 里import requests会报ModuleNotFoundError -
pip3 install requests→ 装进 Python 3 的site-packages,Python 2 无法使用 - 即使你用
python -m pip install,也必须确认python指向哪个版本(which python或python -V)
EasyInstall 已被弃用,setuptools 成为事实标准
easy_install 是 Python 2 时代早期的包安装工具,依赖 setuptools,但本身不支持卸载、依赖解析弱、无版本锁定能力。它在 Python 3.4+ 中已被明确标记为 deprecated,且自 setuptools 58.0(2021 年起)起默认不再捆绑 easy_install 脚本。
- 现在所有主流安装行为都走
pip或pip3,背后调用的是setuptools.build_meta(PEP 517)或distutils.core(旧式 setup.py) -
setup.py install这种原始方式在 Python 3.12+ 中已被移除,必须改用pip install . - 如果你看到项目仍写
python setup.py install,说明它没适配现代 Python 生态,大概率也不支持 Python 3.8+
PyPI 包发布时的 Python 版本声明决定兼容性
一个包能否被 pip 或 pip3 安装,不取决于你本地命令名,而取决于该包在 PyPI 上声明的 python_requires 和 classifiers 元数据:
立即学习“Python免费学习笔记(深入)”;
-
python_requires='>=3.6'→pip install(哪怕你用的是 Python 2)会直接拒绝安装,报错:Package requires Python '>=3.6' -
classifiers=['Programming Language :: Python :: 2']→ PyPI 搜索结果中会标为 “Python 2 only”,但不会阻止你在 Python 3 下尝试安装(可能失败) - 很多老包(如
PIL)只声明支持 Python 2,其替代品Pillow才支持 Python 3 —— 名字变了,API 也略有差异
virtualenv 和 venv 的隔离逻辑直接影响 pip 行为
Python 2 必须靠第三方 virtualenv(需 pip install virtualenv),而 Python 3.3+ 内置 venv 模块。二者创建的环境,pip 命令行为一致,但底层解释器绑定不可逆:
-
python2 -m virtualenv py2env→ 激活后pip就是 Python 2 的 pip -
python3 -m venv py3env→ 激活后pip就是 Python 3 的 pip(等价于pip3) - 误在 Python 2 环境下运行
pip3 install会报错:command not found;反之亦然
真正容易被忽略的点是:包的元数据(python_requires)和本地 pip 命令名没有强制绑定关系——你可能用着 pip3,却因包声明了 python_requires='>=3.9' 而在 Python 3.8 下安装失败。判断依据永远是错误信息里的 Python 版本要求,而不是你敲了哪个命令。


















