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
相关产品推荐
相关产品推荐

