python库构建之pyproject.toml配置文件详解!
python库构建之pyproject.toml配置文件详解!
前言
pyproject.toml 是一个配置文件,用于定义 Python 项目的构建系统和相关的元数据。它是 Python 社区为了解决项目构建和依赖管理问题而引入的一种标准化方式,最初由 PEP 518 提出。pyproject.toml
文件被广泛使用,尤其是在构建工具(如 Poetry
和 Flit
)中,用来替代传统的 setup.cfg
文件。
主要用途
- 定义构建系统:
pyproject.toml
文件中可以指定构建工具及其版本,如setuptools
或poetry
,以及这些工具所需的依赖项。这使得项目的构建环境更加可控和可重复。
- 项目元数据:
- 包括项目的名称、版本、描述、作者、许可证等信息,可以在
pyproject.toml
文件中定义。这些信息可以被构建工具或包管理工具读取和使用。
- 包括项目的名称、版本、描述、作者、许可证等信息,可以在
- 依赖管理:
- 该文件可以管理项目的依赖关系,包括运行时依赖、开发时依赖等,类似于
requirements.txt
,但更加结构化和灵活。
- 该文件可以管理项目的依赖关系,包括运行时依赖、开发时依赖等,类似于
- 配置构建工具的行为:
- 对于不同的构建工具,如
setuptools
、poetry
、black
、isort
等,可以在pyproject.toml
中配置其行为。
- 对于不同的构建工具,如
文件结构
一个典型的 pyproject.toml
文件由几个部分组成,每个部分对应不同的功能和配置信息。以下是LlamaFactory示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [tool.ruff] target-version = "py38" line-length = 119 indent-width = 4 [tool.ruff.lint] ignore = ["C408", "C901", "E501", "E731", "E741", "W605"] select = ["C", "E", "F", "I", "W"] [tool.ruff.lint.isort] lines-after-imports = 2 known-first-party = ["llamafactory"] known-third-party = [ "accelerate", "datasets", "gradio", "numpy", "peft", "torch", "transformers", "trl" ] [tool.ruff.format] quote-style = "double" indent-style = "space" docstring-code-format = true skip-magic-trailing-comma = false line-ending = "auto" |
这个 pyproject.toml
文件配置了项目的构建系统以及使用 ruff
进行代码检查和格式化的相关设置。以下是各部分的详细解释:
1. [build-system]
requires
: 指定了项目的构建系统依赖项。这里要求使用setuptools
版本 61.0 或更高版本。这意味着在构建这个项目时,Python 环境中必须安装setuptools
,且版本不低于 61.0。build-backend
: 指定了用于构建项目的后端工具,这里使用的是setuptools.build_meta
。这意味着setuptools
将作为构建过程的核心工具。
2. [tool.ruff]
target-version
: 指定了代码的目标 Python 版本,这里是 Python 3.8 (py38
)。ruff
将根据这个版本进行相应的检查和优化。line-length
: 指定了代码行的最大长度,超过这个长度会被视为格式错误。这里设置为 119 个字符。indent-width
: 指定代码缩进的宽度,这里设置为 4 个空格。
3. [tool.ruff.lint]
ignore
: 指定了一些要忽略的规则或错误代码。列出的错误代码将不会在代码检查时触发。select
: 指定了要检查的错误或警告类别。只有属于这些类别的检查才会被启用。
4. [tool.ruff.lint.isort]
lines-after-imports
: 指定在导入语句之后应保留的空行数,这里设置为 2 行。known-first-party
: 列出了项目中的第一方模块,即llamafactory
,用于在导入排序时识别项目内部的模块。known-third-party
: 列出了已知的第三方库,这些库将在导入排序时与其他模块区分开来。
5. [tool.ruff.format]
quote-style
: 指定字符串使用的引号样式,这里设置为double
,即双引号。indent-style
: 指定缩进风格,这里使用space
(空格)而非tab
。docstring-code-format
: 设置为true
,表示在文档字符串(docstring)中也会应用代码格式化规则。skip-magic-trailing-comma
: 设置为false
,意味着即使添加魔术尾逗号(magic trailing comma),也不会跳过格式化。line-ending
: 设置为auto
,表示根据操作系统的默认设置自动选择行结尾符。
小结
这个 pyproject.toml
文件主要配置了项目的构建系统,并详细定义了 ruff
工具用于代码风格检查和格式化的规则。这些设置帮助确保代码的一致性和质量,减少错误,并遵循团队的编码规范。
工作流程
在执行 pip install .
时,pyproject.toml
文件会在构建和安装 Python 项目的过程中被引用。具体流程如下:
1. 识别 pyproject.toml 文件
- 当你在项目的根目录执行
pip install .
命令时,pip
会首先检查该目录下是否存在pyproject.toml
文件。 - 如果存在这个文件,
pip
会将其视为该项目的构建配置文件,并按照其中的内容来指导接下来的构建过程。
2. 解析 build-system 部分
pip
首先读取pyproject.toml
文件中的[build-system]
部分。这一部分定义了构建项目所需的依赖项以及构建后端(即构建工具)。requires
: 列出了构建这个项目所需的 Python 包。在执行pip install .
时,pip
会确保这些包已经安装。如果这些包没有安装,pip
会首先安装这些依赖。build-backend
: 指定构建项目所使用的后端工具,比如setuptools.build_meta
或poetry.core.masonry.api
。pip
会调用这个工具来构建项目。
3. 构建源分发包(SDist)和/或轮子包(Wheel)
- 一旦
pip
安装了构建所需的依赖并加载了构建后端,构建后端会被调用来生成源分发包(SDist)和/或轮子包(Wheel)。- 如果使用
setuptools.build_meta
,它会读取项目的setup.py
或setup.cfg
文件来指导包的构建。 - 这些构建输出会保存在临时目录中,用于接下来的安装步骤。
- 如果使用
4. 安装项目
pip
使用生成的包(SDist 或 Wheel)安装项目到目标环境中(通常是当前 Python 环境)。- 如果项目依赖其他包,
pip
会从pyproject.toml
或setup.py
中的install_requires
列表中识别并安装这些依赖。
5. 其他工具配置
pyproject.toml
中的其他部分,如[tool.ruff]
,可能会被相应的工具在构建或开发过程中引用。虽然这些部分不会直接影响pip install .
的过程,但它们在开发环境中依然重要。
简化的执行流程
pip
检查并加载pyproject.toml
文件。- 解析
build-system
,安装构建所需的依赖。 - 使用指定的构建后端构建项目(生成 SDist 和/或 Wheel)。
- 安装生成的包及其依赖。
总结
pyproject.toml
文件在 pip install .
的过程中会被 pip
引用,以确定如何构建和安装项目。pip
主要使用其中的 [build-system]
部分来加载构建工具和依赖,然后调用这些工具生成项目的分发包,并最终将其安装到当前环境中。
学习资料见知识星球。
以上就是今天要分享的技巧,你学会了吗?若有什么问题,欢迎在下方留言。
快来试试吧,小琥 my21ke007。获取 1000个免费 Excel模板福利!
更多技巧, www.excelbook.cn
欢迎 加入 零售创新 知识星球,知识星球主要以数据分析、报告分享、数据工具讨论为主;
1、价值上万元的专业的PPT报告模板。
2、专业案例分析和解读笔记。
3、实用的Excel、Word、PPT技巧。
4、VIP讨论群,共享资源。
5、优惠的会员商品。
6、一次付费只需99元,即可下载本站文章涉及的文件和软件。
共有 0 条评论