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

基于Poetry版本生成可导出的Python包版本号的最优方案

解决Poetry构建时导出Python包版本号的最优方案

方案1:用Python标准库importlib.metadata直接读取元数据(推荐)

不需要生成任何额外文件,直接从包的安装元数据中读取版本号,完全和Poetry配置的tool.poetry.version保持一致。

在你的包的__init__.py中添加以下代码:

from importlib.metadata import version, PackageNotFoundError

try:
    __version__ = version("your-package-name")  # 替换成你的包名
except PackageNotFoundError:
    # 本地开发未安装包时的 fallback,可自行调整
    __version__ = "0.0.0-dev"

优势:

  • 完全消除版本不一致的风险,版本号始终和Poetry配置同步
  • 无需维护__version__.py,也不用处理.gitignore的冲突问题
  • 本地开发时,只要通过poetry install或pip install -e .安装了可编辑版本,就能正确读取到版本

方案2:使用Poetry的动态版本功能

如果你的版本号是基于Git标签管理的,可以用Poetry官方的动态版本功能自动同步版本,再结合上面的importlib.metadata读取。

修改pyproject.toml:

[tool.poetry]
name = "your-package-name"
version = "0.0.0"  # 占位值,会被动态替换
dynamic = ["version"]

[tool.poetry.version]
source = "tag"  # 从Git标签自动获取版本,支持语义化标签

之后同样用importlib.metadata在代码中读取版本即可,Poetry在build时会自动将Git标签对应的版本注入到包元数据中。

方案3:通过构建脚本生成__version__.py(兼容旧版本场景)

如果一定要生成__version__.py,可以通过Poetry的构建脚本在构建阶段生成,避免.gitignore的影响:

  1. 在pyproject.toml中配置构建脚本:
[tool.poetry.build]
script = "build_version.py"
  1. 创建build_version.py脚本,读取Poetry的版本并生成文件:
from poetry.factory import Factory

def build():
    poetry = Factory().create_poetry(".")
    version = poetry.version.text
    with open("your_package/__version__.py", "w") as f:
        f.write(f'__version__ = "{version}"\n')

if __name__ == "__main__":
    build()

注意:

  • 这个脚本会在poetry build时自动执行,生成的__version__.py会被包含到构建包中(构建阶段不受.gitignore影响)
  • 本地开发时如果需要版本号,可以手动执行脚本,或者在poetry install后通过importlib.metadata读取

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 04:33:10