You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python项目版本单一可信源:如何从pyproject.toml同步至__init__.py?

同步pyproject.toml版本到__init__.py的常用方法

下面是几种无需手动重复维护版本号的实用方案:

1. 使用setuptools-scm(推荐)

这是Python生态中广泛使用的工具,能自动从Git等版本控制系统生成版本号,同时自动同步到项目配置和代码中,无需手动编写固定版本号。

配置步骤:

  • 在pyproject.toml中启用动态版本并添加工具配置:
[project]
name = "foo"
dynamic = ["version"]

[tool.setuptools_scm]
  • 在foo/__init__.py中通过包元数据获取版本:
# 兼容Python 3.8+的现代写法
from importlib.metadata import version as get_version
__version__ = get_version(__name__)

# 兼容旧版本Python的写法
# from pkg_resources import get_distribution
# __version__ = get_distribution(__name__).version

工具会自动处理版本号的生成与同步,发布时直接用pip wheel或python -m build即可,无需手动修改版本字段。

2. 编写自定义同步脚本

如果不想依赖第三方工具,可以写一个简单的Python脚本,在发布前手动或自动执行,将pyproject.toml的版本写入__init__.py:

import tomllib
import os

# 读取pyproject.toml中的版本
with open("pyproject.toml", "rb") as f:
    pyproject_data = tomllib.load(f)
project_version = pyproject_data["project"]["version"]

# 生成__init__.py内容
init_content = f'__version__ = "{project_version}"\n'

# 写入目标文件
init_path = os.path.join("foo", "__init__.py")
with open(init_path, "w") as f:
    f.write(init_content)

可以把这个脚本加入到项目的构建流程(比如Makefile、pre-commit钩子),确保每次版本变更后自动执行。

3. 在__init__.py中直接读取pyproject.toml

开发阶段可以直接在__init__.py中读取pyproject.toml的版本号,无需提前写入:

import tomllib
import os

def _get_project_version():
    # 定位pyproject.toml路径(假设项目结构是根目录下的pyproject.toml和foo文件夹)
    root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    pyproject_path = os.path.join(root_dir, "pyproject.toml")
    with open(pyproject_path, "rb") as f:
        data = tomllib.load(f)
    return data["project"]["version"]

__version__ = _get_project_version()

注意:这种方法仅适合开发场景,因为安装后的包不会包含pyproject.toml,运行时会报错,不适合发布后的正式包使用。

内容的提问来源于stack exchange,提问作者user14717

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:05:18