pyproject.toml

pyproject.tomlPython 项目统一的配置文件 ,用来集中管理构建、依赖、工具配置,让项目更标准化、更可移植。

它在 2016 年被 PEP 518 引入,现在已经成为 所有现代 Python 项目的核心文件 (类似 Node.js 的 package.json)。


一句话概括它的作用

pyproject.toml 用来告诉 Python:你的项目要怎么构建、用什么工具、有哪些依赖。


🔍 详细作用拆解

1. 声明构建系统(build backend)

Python 构建 wheel 或安装包时,会先读取 pyproject.toml,找到:

toml 复制代码
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

这意味着:

  • 用什么工具构建?
  • 构建时需要哪些依赖?

类似 Node 中的 "scripts" + 构建工具"

常见的 backend:

工具 描述
setuptools 标准构建工具(旧项目)
poetry 现代项目常用
pdm 轻量、快速
hatch 高级构建工具
flit 超轻量的包管理

2. 管理项目依赖(dependencies)

现代工具(如 Poetry、PDM)直接把依赖写在这里:

toml 复制代码
[tool.poetry.dependencies]
requests = "^2.31.0"
pydantic = "^2.0"

requirements.txt 更规范,更可管理(不过两者可以共存)。


3. 集中管理所有工具配置

这是它最强大的地方。

几乎 Python 生态的所有工具都支持从 pyproject.toml 读取配置,例如:

工具 配置示例
Black 格式化规则
Ruff / flake8 Lint 配置
mypy 静态类型检查
pytest 测试配置
isort import 排序
coverage 测试覆盖率

例子:

toml 复制代码
[tool.black]
line-length = 100

[tool.mypy]
strict = true

[tool.pytest.ini_options]
python_files = ["tests/*.py"]

优点:不用再到处放 setup.cfgtox.ini.flake8 等杂乱文件。


4. 声明项目元数据(metadata)

构建系统如 setuptools 使用它描述你的包:

toml 复制代码
[project]
name = "my_app"
version = "0.1.0"
description = "A demo app"
dependencies = ["requests"]

这在发布到 PyPI 时必须提供。


5. 定义可执行命令(entrypoints / scripts)

toml 复制代码
[project.scripts]
my-cli = "my_app.main:run"

安装后可以直接运行:

复制代码
my-cli

📌 为什么会出现?

因为传统 Python 项目到处都有配置文件:

复制代码
setup.py
setup.cfg
requirements.txt
MANIFEST.in
tox.ini
mypy.ini
pyproject.toml(以前没有)

非常混乱。

所以 PEP 518 / PEP 621 推出了 pyproject.toml

  • 统一格式
  • 更可移植
  • 构建环境自动隔离
  • 生态工具都能共享配置

现在几乎所有 Python 新项目都必须有它。


✨ 总结:它主要做 3 件事

功能 目的
构建系统声明 Python 如何构建这个项目
依赖管理 安装项目需要哪些包
工具配置中心 Black/Mypy/Pytest 等统一在此配置

.toml 是一种 配置文件格式,名字来自:

TOML = Tom's Obvious, Minimal Language

由 GitHub 联合创始人 Tom Preston-Werner 设计。

它的目标是:

  • 易读(比 JSON 更直观)
  • 易写(不用大括号、引号、逗号)
  • 适合做配置(格式稳定、安全)

这就是为什么 Python 把它选为统一的项目配置文件格式。


🔍 .toml 是什么类型?

它是一种 结构化、键值对(key-value)的配置语言,类似:

格式 对比
INI 最像它
JSON 更严格,但阅读性差
YAML 更强大,但更容易写错(缩进地狱)
TOML 介于 JSON 和 INI 之间,简单又安全

🧩 TOML 的几个特点

1. 人类可读性强

例如:

toml 复制代码
name = "Lewis"
age = 28
active = true

比 JSON 没有大括号、没有引号地狱:

json 复制代码
{"name": "Lewis", "age": 28, "active": true}

2. 支持分组(类似 INI)

toml 复制代码
[database]
host = "localhost"
port = 5432

3. 支持丰富的数据类型

类型 示例
字符串 name = "abc"
整数、浮点 count = 12
布尔 enabled = true
数组 items = [1, 2, 3]
时间日期 time = 2025-05-20T12:00:00Z

4. 解析快、安全、无歧义

不像 YAML 那样:

  • 缩进错了就寄
  • tab 和 space 容易被混
  • 一些格式有歧义

TOML 的设计目标就是"没有坑"。


🤔 为什么 Python 选 TOML?

因为 Python 社区需要一个统一配置格式:

过去工具各自有自己的配置文件:

复制代码
setup.py
setup.cfg
requirements.txt
tox.ini
pytest.ini
flake8.cfg
mypy.ini

维护非常乱。

要统一,就需要一种:

  • 易读
  • 易写
  • 无歧义
  • 稳定
  • 可扩展
  • 被其他语言也接受的格式

TOML 完全符合,于是被官方 PEP 518/PEP 621 采用,用于 pyproject.toml

现在 Rust、Go、Python 都大量使用 TOML。


📌 小结

.toml 是:

  • 一种配置文件语言
  • 简单、稳定、无歧义
  • 被 Python 官方选择为未来统一格式
  • 用来写 pyproject.tomlpoetry.lock 等文件

相关推荐
m5655bj9 小时前
通过 Python 提取 PDF 表格数据
服务器·python·pdf
玄同7659 小时前
面向对象编程 vs 其他编程范式:LLM 开发该选哪种?
大数据·开发语言·前端·人工智能·python·自然语言处理·知识图谱
南_山无梅落9 小时前
PyCharm 安装了库却无法 Alt + Enter 导入?(简洁排查版)
ide·python·pycharm·虚拟环境·alt·enter·.venv
ID_180079054739 小时前
Python采集闲鱼商品详情API:JSON数据解析与应用实践
数据库·python·json
APIshop9 小时前
API 接口文档测试:从“能跑”到“敢上线”的完整闭环
爬虫·python
AndrewHZ9 小时前
【复杂网络分析】如何入门Louvain算法?
python·算法·复杂网络·社区发现·community det·louvain算法·图挖掘
沈浩(种子思维作者)9 小时前
梦境意识之谜——豆包补充
人工智能·python·量子计算
盼哥PyAI实验室10 小时前
[特殊字符]️ 实战爬虫:Python 抓取【采购公告】接口数据(含踩坑解析)
开发语言·爬虫·python
Hello.Reader10 小时前
Flink ML VectorAssembler 把多列特征“拼”成一个向量列(数值 + 向量都支持)
java·python·flink
Csvn10 小时前
🐫 Ollama 基础使用指南
人工智能·python