pyproject.toml 规范提供了指定项目版本的能力,例如
[project]
name = "foo"
version = "0.0.1"
但是,将
__version__ = "0.0.1"
放在 foo/__init__.py
中以便用户查询也是一种常见的 Python 习惯用法。
有没有一种标准方法可以从
version
中提取 pyproject.toml
并将其放入 foo/__init__.py
中?
您可以采取两种方法。
将版本保留在
pyproject.toml
中,并从源代码中的包元数据中获取它。所以,在您的 mypkg/__init__.py
或任何地方:
from importlib.metadata import version
__version__ = version("mypkg")
importlib.metadata.version
自 Python 3.8 起可用。对于早期的 Python 版本,您可以使用 importlib_metadata
向后移植执行类似操作。
将版本保留在源代码中并指示构建系统从那里获取它。对于 setuptools 构建后端,它看起来像这样
pyproject.toml
:
[project]
name = "mypkg"
dynamic = ["version"]
[tool.setuptools.dynamic]
version = {attr = "mypkg.__version__"}
我的建议是(🥁)...都不是!根本不要在源代码中保留
__version__
属性。这是一个过时的习惯,现在我们可以不用了。 Version
已经是包元数据中的required字段,在包/模块命名空间中保留相同的字符串作为属性是多余的。