当前位置: 首页 > news >正文

pip会读取 pyproject.toml 的 project.dependencies 字段进行依赖安装吗?

这是一个非常重要且常见的问题,答案是:

通常不会 —— pip 本身不会直接从 pyproject.tomlproject.dependencies 字段安装依赖,除非你正在安装当前项目本身(例如 pip install .pip install -e .)。


详细解释

✅ 情况一:你运行 pip install .(安装本地项目)

  • 如果项目使用 PEP 621 标准(即 pyproject.toml 中有 [project] 表,包含 dependencies 字段),
  • 并且配置了兼容的 构建后端(如 setuptools >= 61, hatchling, pdm-backend, flit-core 等),
  • 那么 pip 会调用该构建后端构建 wheel,并在安装项目的同时 自动安装 project.dependencies 中列出的依赖

✅ 示例 pyproject.toml(PEP 621 格式):

[build-system]
requires = ["setuptools>=61"]
build-backend = "setuptools.build_meta"[project]
name = "my-package"
version = "0.1.0"
dependencies = ["requests>=2.25.0","click"
]

运行:

pip install .
# 或
pip install -e .

→ 此时 requestsclick 会被自动安装。


❌ 情况二:你运行 pip install some-package(从 PyPI 安装)

  • pip 不会去读取 PyPI 上包的 pyproject.toml 文件;
  • 它读取的是该包在构建时生成的 metadata(如 METADATA 文件),其中依赖信息已经由构建后端写入;
  • 所以依赖安装是基于 已构建好的分发包(wheel/sdist)中的元数据,而不是原始 pyproject.toml

❌ 情况三:你只是想“根据 pyproject.toml 安装依赖”,但不安装项目本身

比如你有一个 pyproject.toml,只想装它的依赖(类似 pip install -r requirements.txt),那么:

pip 无法直接做到这一点

你需要:

  • 使用支持该功能的工具(如 hatch, pdm, poetry);
  • 或手动提取依赖并用 pip 安装。
✅ 替代方案示例:
  1. 使用 hatch(如果项目使用 hatchling):

    hatch env create
    hatch shell
    # 或直接安装依赖(不安装项目):
    pip install $(hatch deps)
    
  2. 使用 pdm

    pdm install --no-self  # 只装依赖,不装项目
    
  3. 临时脚本提取并安装(假设符合 PEP 621):

    # install-deps.py
    import tomllib
    with open("pyproject.toml", "rb") as f:deps = tomllib.load(f)["project"]["dependencies"]
    import subprocess
    subprocess.check_call(["pip", "install"] + deps)
    

    然后运行:

    python install-deps.py
    

关键总结

场景 pip 会安装 pyproject.toml 中的 dependencies 吗?
pip install .pip install -e . (前提是构建后端支持 PEP 621)
pip install package-from-pypi ✅ 会安装依赖,但不是直接读 pyproject.toml,而是读构建后的元数据
pip install -r pyproject.toml 不支持pip 不接受 pyproject.toml 作为 requirements 文件)
仅想安装依赖而不安装项目 pip 无法直接实现,需借助其他工具或脚本

建议

  • 如果你使用现代 Python 打包(PEP 621),推荐搭配 setuptools + pip install -e . 进行开发;
  • 如果需要频繁管理依赖(增删改),建议使用 Poetry / PDM / Hatch 等专用工具;
  • 不要期望 pip 能像 npmcargo 那样直接操作项目配置文件——它的职责是安装包,而不是管理项目配置
http://www.rkmt.cn/news/25244.html

相关文章:

  • python教程(一)
  • OpenAI Codex整合Z.ai GLM-4.6编程
  • 无状态HTTP的“记忆”高效的方案:Spring Boot中CookieSession全栈实战
  • LLM 笔记 —— 01 大型语言模型修炼史(Self-supervised Learning、Supervised Learning、RLHF) - 实践
  • el-dialog 嵌套遮罩灰色问题
  • Microsoft 代理框架简介(预览版):让每个开发人员都能轻松使用 AI 代理
  • 站位3
  • 基于深度学习的CT扫描图像肝脏肿瘤智能检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】 - 实践
  • resend 单次发送命令
  • 视频监控界的“万能翻译器”:视频汇聚平台EasyCVR视频接入功能全解读
  • 基于Ubuntu22.04 部署Dify详细教程
  • iOS 混淆工具链实战 多工具组合完成 IPA 混淆与加固(iOS混淆|IPA加固|无源码加固|App 防反编译)
  • 使用 Github Pages 和 Hexo 搭建博客
  • linux 移动硬盘加载失败
  • java Web 检查清单程序设计与实现 - 教程
  • 实用指南:如何快速学习一个网络协议?
  • 日记11
  • 2025年太阳能板定制厂家口碑排行榜单:权威推荐与选择指南
  • linux内核开发学习计划
  • 2025年湖北武汉实验室装修/实验室设计/实验室改造哪个厂家好
  • 2025年AI搜索优化品牌排行榜前十强权威发布
  • 直播回顾|PostgreSQL 18 六大新特性深度解析
  • 异常----Windows 已保护你的电脑:Microsoft Defender SmartScreen 阻止了无法识别的应用启动。运行此应用可能会导致你的电脑存在风险。
  • 深入解析:Thinkphp-Laravel467 小程序校运会高校运动会管理系统
  • 082_尚硅谷_单分支双分支课堂练习(2)
  • 把“扔硬币”搬到互联网:一文看懂 AB 测试的底层逻辑 - 指南
  • 记录下,cadence17.4 PCB封装更新方法
  • springboot使用aop切面,记录日志
  • SqlServer 事务复制的两个参数immediate_sync,allow_anonymous
  • OO之接口-DAO模式代码阅读及应用