由pyproject.toml引发的讨论

本文详细介绍了Python项目中的pyproject.toml配置文件,包括依赖管理、元数据、可选依赖等部分,并讲解了Flit和Poetry这两个打包及依赖管理工具的使用,如构建、发布和安装命令。通过pyproject.toml,开发者可以更加方便地管理Python项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

今天在搜集数据集的时候遇到了pyproject.toml配置文件,点开来一看发现有许多依赖包和配置信息,查找资料一看,还可以用pyproject.toml进行依赖包管理。

pyproject.toml文件

该文件的部分由多个部分组成。tool.poetry pyproject.toml

以项目<''https://github.com/tiangolo/fastapi/blob/master/pyproject.toml"> fastapi 的pyproject为例,介绍一下pyproject.toml的组成部分:

这告诉像pip这样的工具用flit构建你的项目。这是 PEP 517 定义的标准。对于任何使用Flit的新项目。

[build-system]
requires = ["flit"]
build-backend = "flit.buildapi"

发布包的一些信息,作者,首页等等、。

[tool.flit.metadata]
module = "fastapi"
author = "Sebastián Ramírez"
author-email = "tiangolo@gmail.com"
home-page = "https://github.com/tiangolo/fastapi"

发布到pypi上的分类信息,require字段是此包所需的 PyPI 中的其他包的列表。

[tool.flit.metadata]
# ...
classifiers = [
    "Intended Audience :: Information Technology",
    "Intended Audience :: System Administrators",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python",
    "Topic :: Internet",
    "Topic :: Software Development :: Libraries :: Application Frameworks",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Topic :: Software Development :: Libraries",
    "Topic :: Software Development",
    "Typing :: Typed",
    "Development Status :: 4 - Beta",
    "Environment :: Web Environment",
    "Framework :: AsyncIO",
    "Framework :: FastAPI",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: MIT License",
    "Programming Language :: Python :: 3 :: Only",
    "Programming Language :: Python :: 3.6",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Topic :: Internet :: WWW/HTTP :: HTTP Servers",
    "Topic :: Internet :: WWW/HTTP",
    requires = [
    "starlette==0.19.1",
    "pydantic >=1.6.2,!=1.7,!=1.7.1,!=1.7.2,!=1.7.3,!=1.8,!=1.8.1,<2.0.0",
	]
	description-file = "README.md"
	requires-python = ">=3.6.1"
]

除了基本 url (和 ) 之外,您还可以在该部分中指定任何自定义 URL项目路径。项目的 URL,例如其 Github 存储库。

[tool.flit.metadata.urls]
Documentation = "https://fastapi.tiangolo.com/"

可选依赖项,用于增强包,但不是必需的,包含着一些测试环境的依赖等等。每个可选功能所需的包列表。这些要求的指定格式与指定的格式相同。

[tool.flit.metadata.requires-extra]
test = [
    "pytest >=6.2.4,<7.0.0",
    "pytest-cov >=2.12.0,<4.0.0",
    "mypy ==0.910",
    "flake8 >=3.8.3,<4.0.0",
    "black == 22.3.0",
    "isort >=5.0.6,<6.0.0",
    "requests >=2.24.0,<3.0.0",
    "httpx >=0.14.0,<0.19.0",
    "email_validator >=1.1.1,<2.0.0",
    "sqlalchemy >=1.3.18,<1.5.0",
    "peewee >=3.13.3,<4.0.0",
    "databases[sqlite] >=0.3.2,<0.6.0",
    "orjson >=3.2.1,<4.0.0",
    "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0",
    "python-multipart >=0.0.5,<0.0.6",
    "flask >=1.1.2,<3.0.0",
    "anyio[trio] >=3.2.1,<4.0.0",

    # types
    "types-ujson ==4.2.1",
    "types-orjson ==3.6.2",
    "types-dataclasses ==0.6.5; python_version<'3.7'",
]
doc = [
    "mkdocs >=1.1.2,<2.0.0",
    "mkdocs-material >=8.1.4,<9.0.0",
    "mdx-include >=1.4.1,<2.0.0",
    "mkdocs-markdownextradata-plugin >=0.1.7,<0.3.0",
    # TODO: upgrade and enable typer-cli once it supports Click 8.x.x
    # "typer-cli >=0.0.12,<0.0.13",
    "typer >=0.4.1,<0.5.0",
    "pyyaml >=5.3.1,<7.0.0",
]
dev = [
    "python-jose[cryptography] >=3.3.0,<4.0.0",
    "passlib[bcrypt] >=1.7.2,<2.0.0",
    "autoflake >=1.4.0,<2.0.0",
    "flake8 >=3.8.3,<4.0.0",
    "uvicorn[standard] >=0.12.0,<0.18.0",
    "pre-commit >=2.17.0,<3.0.0",
]
all = [
    "requests >=2.24.0,<3.0.0",
    "jinja2 >=2.11.2,<4.0.0",
    "python-multipart >=0.0.5,<0.0.6",
    "itsdangerous >=1.1.0,<3.0.0",
    "pyyaml >=5.3.1,<7.0.0",
    "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0",
    "orjson >=3.2.1,<4.0.0",
    "email_validator >=1.1.1,<2.0.0",
    "uvicorn[standard] >=0.12.0,<0.18.0",
]

安装软件包时,可以使用以下选项指定附加功能:-E|–extras

poetry install --extras "mysql pgsql"
poetry install -E mysql -E pgsql

Flit简化的python打包模块

Command options:
-f <path>, --ini-file <path>

指定要构建的模块的配置文件的路径。缺省值为 。pyproject.toml

--version

显示正在使用的 Flit 版本。

--help

在命令行界面上显示帮助。

--debug

显示有关 flit 正在执行的操作的更详细日志。

flit build

Build a wheel and an sdist (tarball) from the package.

--format <format>

限制为发布或 .通常应同时发布这两种格式。wheelsdist

--setup-py

在 sdist 中生成一个文件,以便可以通过旧版本的 pip 进行安装。setup.py

flit publish

Build a wheel and an sdist (tarball) from the package, and upload them to PyPI or another repository.用于上传到pypi上

--repository <repository>

要将包上载到的存储库的名称。应与 中的某个部分匹配。缺省值为 。~/.pypircpypi

--pypirc <pypirc>

要使用的 .pypirc 配置文件。缺省值为 。~/.pypirc

flit install

在系统上安装软件包。

默认情况下,软件包安装在Flit本身安装的同一Python环境中;使用 --python 或 FLIT_INSTALL_PYTHON 来覆盖它。

如果您没有修改环境的权限(例如Linux上的系统Python),Flit可以进行用户安装。使用 --user 或 --env 标志以一种或另一种方式强制这样做。

-s, --symlink

将模块符号链接到站点包中,而不是复制它,以便可以测试更改而无需重新安装模块。

 --deps <dependency option>

要安装的依赖项。、 、 或 之一。 并安装附加组件 、 和 。违约。all production develop none all developtest docdev all

--extras <extra[,extra,...]>

哪个命名了要为其安装依赖项的额外功能。指定安装所有可选依赖项或以逗号分隔的附加组件列表。缺省值取决于 。all–deps

--user

执行用户本地安装。如果 flit 不在 virtualenv 或 conda env 中(如果环境的库目录是只读的并且为 true),则这是默认设置。site.ENABLE_USER_SITE

--env

安装到环境中 - 与 --user 相反。这是 virtualenv 或 conda env 中的默认值(如果环境的库目录是可写的或 false)。site.ENABLE_USER_SITE

flit init

通过提示输入有关当前目录中模块的信息来创建新的配置文件。pyproject.toml

poetry

Poetry是Python中用于依赖管理和打包的工具。和flit及其类似,详见https://python-poetry.org/docs/

参考文章

https://www.jianshu.com/p/9fb0d69134d2
https://flit.pypa.io/en/latest/cmdline.html
https://python-poetry.org/docs/pyproject/
https://www.cnblogs.com/dongfangtianyu/p/14382420.html

从您提供的 `pyproject.toml` 内容来看,这份配置文件主要用于定义项目的构建系统、依赖项以及包的查找规则。接下来我们结合之前的报错信息对其进行分析。 --- ### 1. **[build-system] 部分** ```toml [build-system] requires = ["setuptools==70.0.0", "torch"] build-backend = "setuptools.build_meta" ``` - 这里指定了用于构建项目的工具集及版本号(如 `setuptools==70.0.0` 和 `torch`)。虽然这里设定了 `setuptools` 的特定版本,但如果实际运行环境中的 `setuptools` 版本低于所设定值,则可能会引发兼容性问题。 - 此外,“torch”作为构建需求列出并不常见;一般而言框架类库应归于 runtime dependencies 下而非 build-time ones。(除非该项目在编译阶段就需要 PyTorch 提供的功能) **改进建议:** 把 torch 放入 `[project.dependencies]` 更合适些. --- ### 2. **[project] 部分** ```toml [project] name = "MAST3R-SLAM" version = "0.0.1" dependencies = [ "numpy==1.26.4", "einops", "pyrealsense2", "evo", "natsort", "lietorch @ git+https://github.com/princeton-vl/lietorch.git", "plyfile", ] ``` 这部分描述了项目的名称(`MAST3R-SLAM`)及其版本号(`0.0.1`)还有所需外部依赖列表。其中值得注意的一点在于 `"lietorch"` 使用了 Git URL 定位方式,意味着该依赖来源于 GitHub 上的一个仓库而不是传统的 PyPI 源地址。这本身没问题,不过需要保证网络连接良好并且具备访问对应资源权限才行。 另外关于 numpy 的具体指定版本 `==1.26.4` ,考虑到 NumPy 更新频率较快且不同次发行间可能存在 API 变更风险等因素影响,有时允许一定范围内的小幅度升级反而更有利稳定性的维持,比如改为 `>=1.26,<2`. --- ### 3. **[tool.setuptools.packages.find] 部分** ```toml [tool.setuptools.packages.find] where = ['.'] include = ['mast3r_slam'] namespaces = false ``` 此处设置了 setuptools 查找 Python 包的方式: - 参数 `where=['.']` 表示搜索根目录; - 参数 `include=['mast3r_slam']` 明确限定了仅考虑命名为 `mast3r_slam` 的那个包; - 最后一行 `namespaces=false` 则关闭了命名空间包的支持功能。 尽管如此设置看起来基本合理,但之前提到过的警告信息仍存在: ```plaintext Package 'mast3r_slam.backend.src' is absent from the `packages` configuration. ``` 这意味着当前的 find 规则未能捕捉到完整结构树下的所有必要组成部分。如果真的有必要保留 backend/src 相关内容的话,那得适当调整 include pattern ,例如改成类似于这样的表达式形式: ```toml include = ['mast3r_slam*', '*backend*'] ``` 当然前提条件是你确认这些额外路径也是预期范围内的一部分。 --- ### 总结 综合以上各部分内容讨论可知,原 TOML 文件虽已涵盖了大部分基本信息要点但仍有一些细节处值得优化改进以尽量规避潜在隐患。特别是针对之前出现的那个“子模块缺失”的告警现象给出了相应处理意见方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值