pip可编辑安装中传递依赖的推断逻辑及存储位置咨询
pip 推断传递依赖的逻辑
pip 处理传递依赖的核心流程是递归解析:
- 首先读取目标包的直接依赖声明,明确依赖包及其版本约束
- 对每个直接依赖,重复执行“读取依赖声明”的操作,直到收集完所有层级的依赖
- 过程中会自动处理版本冲突,选择满足所有约束条件的最优版本(默认优先选最新兼容版本)
不同类型项目中依赖信息的存放位置
1. 已构建项目(Wheels)
Wheels 是预编译的二进制包,依赖信息直接存储在包内的 {package-name}.dist-info/METADATA 文件中:
- 该文件遵循 PEP 规范,通过
Requires-Dist字段列出所有直接依赖,包含版本约束、可选依赖等细节 - pip 安装 Wheel 时无需执行构建脚本,直接读取此文件即可获取依赖信息,这也是 Wheel 安装速度快的原因之一
2. 源码项目(SDists)
SDists 是源码分发包,依赖信息的声明与存储分两个阶段:
- 源码阶段:依赖最初定义在项目根目录的
setup.py、setup.cfg或pyproject.toml中(比如setup.py里的install_requires参数,pyproject.toml里的dependencies字段) - 安装阶段:pip 会先通过
pyproject.toml确定构建后端(如 setuptools),执行构建流程生成临时元数据,最终在安装后的{package-name}.dist-info/METADATA文件(或构建过程中生成的PKG-INFO文件)中,整理出标准化的依赖列表
3. 可编辑安装(Editable Installs)
可编辑安装时,pip 不会将包复制到 site-packages,而是通过链接指向源码目录,依赖信息的处理分为两种情况:
- 依赖声明的源头还是源码目录下的
setup.py、setup.cfg或pyproject.toml - 安装后,site-packages 中会生成对应的
{package-name}.egg-info(setuptools 传统方式)或{package-name}.dist-info目录,其中的METADATA或PKG-INFO文件会存储解析后的依赖信息 - 注意:如果修改了源码中的依赖声明,必须重新执行
pip install -e .更新元数据文件,否则 pip 无法识别依赖变化
内容的提问来源于stack exchange,提问作者caeus
相关产品推荐
相关产品推荐

