如何从Poetry管理的Python项目内部动态获取项目版本?
解决Poetry打包Python库的动态版本获取问题
方案一:兼容开发/部署环境的版本获取逻辑
这种方法优先从已安装包的元数据读取版本(和importlib.metadata.version('example_library')完全一致),开发环境下自动回退到读取项目根目录的pyproject.toml,无需依赖Poetry API,适配任意部署位置。
代码实现(example_library.py)
import importlib.metadata from pathlib import Path import tomllib # Python 3.11+;若用Python 3.10及以下,需安装`toml`库并替换为import toml def get_version(): # 优先从已安装包的元数据获取版本(部署环境用) try: return importlib.metadata.version("example_library") except importlib.metadata.PackageNotFoundError: # 开发环境下,向上遍历目录找到pyproject.toml current_dir = Path(__file__).resolve().parent while current_dir != current_dir.parent: pyproject_path = current_dir / "pyproject.toml" if pyproject_path.exists(): # 读取toml文件 with open(pyproject_path, "rb") as f: pyproject_data = tomllib.load(f) return pyproject_data["tool"]["poetry"]["version"] current_dir = current_dir.parent raise RuntimeError("无法在上级目录找到pyproject.toml文件") def get_some_dict(): return { "version": get_version(), # 可添加其他字段 }
注意事项
- 如果你的项目需要兼容Python 3.10及以下版本,需在开发依赖中添加
toml库:
并将代码中的[tool.poetry.dev-dependencies] toml = "^0.10.2"import tomllib替换为import toml,同时把tomllib.load(f)改为toml.load(f)。 - 该逻辑会自动适配项目的任意目录结构,只要
pyproject.toml位于项目根目录即可。
方案二:让Poetry自动生成版本文件(可选)
如果你希望完全通过Poetry的打包流程注入版本,可配置Poetry在打包时自动生成包含版本信息的文件:
1. 修改pyproject.toml
添加以下配置,让Poetry生成_version.py文件:
[tool.poetry] name = "example_library" version = "0.1.0" # 其他原有配置... [tool.poetry.build] generate-setup-file = true
2. 在example_library.py中导入版本
from ._version import __version__ as get_version def get_some_dict(): return { "version": get_version(), # 其他字段 }
注:
_version.py会在执行poetry build或poetry install时自动生成,版本值与pyproject.toml一致,且和importlib.metadata.version('example_library')返回值完全匹配。
内容的提问来源于stack exchange,提问作者Beast
相关产品推荐
相关产品推荐

