这是一个非常重要且常见的问题,答案是:
通常不会 ——
pip
本身不会直接从pyproject.toml
的project.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 .
→ 此时 requests
和 click
会被自动安装。
❌ 情况二:你运行 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
安装。
✅ 替代方案示例:
-
使用
hatch
(如果项目使用 hatchling):hatch env create hatch shell # 或直接安装依赖(不安装项目): pip install $(hatch deps)
-
使用
pdm
:pdm install --no-self # 只装依赖,不装项目
-
临时脚本提取并安装(假设符合 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
能像npm
或cargo
那样直接操作项目配置文件——它的职责是安装包,而不是管理项目配置。