pyproject.toml 有类似 python setup.py --version 的东西吗?

the*_*orn 5 python pyproject.toml

使用一个简单的setup.py文件:

from setuptools import setup
setup(
    name='foo',
    version='1.2.3',
)
Run Code Online (Sandbox Code Playgroud)

我可以

$> python setup.py --version
1.2.3
Run Code Online (Sandbox Code Playgroud)

无需安装软件包。

等效文件是否有类似的功能pyproject.toml

[project]
name = "foo"
version = "1.2.3"
Run Code Online (Sandbox Code Playgroud)

sin*_*roc 3

对于 Python 3.11+,类似这样的事情应该可以工作:

python3.11 -c "import tomllib; print(tomllib.load(open('pyproject.toml', 'rb'))['project']['version'])"
Run Code Online (Sandbox Code Playgroud)

这直接解析 TOML 文件,并假设版本不是动态的


在某些情况下,版本在 中声明为动态pyproject.toml,因此无法直接从此文件中解析它,解决方案(唯一的?)是实际构建项目,或者至少构建其元数据

为此,我们可以使用项目build.util.project_wheel_metadata()中的函数,例如使用如下的小脚本:build

#!/usr/bin/env python

import argparse
import pathlib

import build.util

def _main():
    args_parser = argparse.ArgumentParser()
    args_parser.add_argument('path')
    args = args_parser.parse_args()
    path_name = getattr(args, 'path')
    path = pathlib.Path(path_name)
    #
    metadata = build.util.project_wheel_metadata(path)
    version = metadata.get('Version')
    print(version)

if __name__ == '__main__':
    _main()
Run Code Online (Sandbox Code Playgroud)

或者作为一句单行:

python -c "import build.util; print(build.util.project_wheel_metadata('.').get('Version'))"
Run Code Online (Sandbox Code Playgroud)

  • 它是标准化的,[这里是标准规范](https://packaging.python.org/en/latest/specifications/declaring-project-metadata/)。为什么是“*叹气*”?诗歌在标准出现之前就已存在,它们会迁移,但这些东西需要时间。他们并不是拒绝这样做,据我所知,情况并非如此。-- TOML 一行代码就是您所需要的,因为甚至 TOML 解析库也在 Python 的标准库中。人还能有什么愿望呢? (3认同)
  • 请注意,“setuptools”仍然只是第 3 方构建工具的“选择”之一。我认为你真正的“抱怨”是Python没有祝福任何一种“构建工具”作为标准。元数据标准化;通过有意的设计(无论好坏),访问它是*不*的。(也就是说,如果 `build/__main__.py` 公开了一种查询元数据的方法,而不必显式地将某些内容与 `build.util` 拼凑在一起,那就太好了。) (2认同)