pip install 执行解析、索引查询、下载校验、构建(如需)和安装全流程:1. 解析包名与版本约束,适配Python/平台;2. 从PyPI匹配兼容wheel/sdist;3. 下载校验并缓存;4. wheel直接解压安装,sdist需先构建;5. 安装后检查依赖冲突但不自动解决。

当你运行 pip install some-package,pip 并不只是“下载并复制文件”——它执行了一套完整的解析、获取、构建和安装流程,涉及网络、依赖管理、Python 环境适配等多个环节。
1. 解析包名与版本约束
pip 先对命令中的包名(如 requests)和可选版本说明(如 ==2.31.0、>=2.28、~>2.30)进行语法解析,生成一个版本范围条件。它还会检查当前 Python 版本、平台标签(如 cp39-win_amd64)、是否启用 --pre 等参数,这些都会影响后续可选的发行版(wheel 或 sdist)。
2. 查询索引源并匹配兼容发行版
pip 默认访问 PyPI(https://pypi.org/simple/),发送 GET 请求获取包的简单索引页(HTML 列表)。它从中提取所有可用发行版的 URL,并根据以下规则筛选:
- 匹配当前 Python 版本(
python_version、python_full_version) - 匹配平台与 ABI(如
manylinux2014_x86_64、win_amd64) - 跳过需要编译但未安装构建工具的
.tar.gz(sdist),除非显式指定--no-binary - 优先选择预编译的
.whl文件(wheel),因其无需本地构建
3. 下载、校验与缓存
选定发行版后,pip 从对应 URL 下载文件。下载过程中会做两件事:
立即学习“Python免费学习笔记(深入)”;
首先Eclipse需要安装Maven的插件, 用MyEclipse安装Maven插件,建出的Maven项目有些问题。一是,发布tomcat的时候resources总是不会被发布到tomcat下;二是,把WEB-INF下的classes改到target下的classes,但是不知道为什么MyEclipse要么仍然在WEB-INF下生成class。要么真不在WEB-INF生成classes了但是发布tomcat的时候,class文件一个都不会给你发布过去,超级郁闷。但是使用Eclipse构建Maven项目后,
- 用哈希值(如 SHA256)校验完整性,防止传输损坏或镜像篡改
- 将文件存入本地缓存目录(如
~/Library/Caches/pip或%LOCALAPPDATA%\pip\Cache),下次安装相同版本可直接复用
若使用 --find-links 或私有索引,pip 也会按同样逻辑解析并校验本地或内网路径下的包。
4. 构建(如需)与安装到 site-packages
对于 wheel 包:直接解压其 data/ 和 purelib/ 内容,按 RECORD 文件记录的路径写入当前环境的 site-packages 目录,并生成 .dist-info/ 元数据文件夹。
对于源码包(sdist):先解压,再调用 build-backend(默认是 setuptools.build_meta)执行构建,生成临时 wheel,再按 wheel 流程安装。若构建失败(如缺 gcc 或 pyproject.toml 配置错误),安装即中止。
安装完成后,pip 还会检查依赖冲突(例如两个包要求不同版本的 click),但默认不自动解决——仅提示警告;启用 --force-reinstall 或 --break-system-packages(Python 3.12+)才可能覆盖已有包。









