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 那样直接操作项目配置文件——它的职责是安装包,而不是管理项目配置
posted @ 2025-10-20 14:40  悠哉大斌  阅读(7)  评论(0)    收藏  举报