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

使用pyproject.toml从模块文件动态设版本,pip安装报错如何解决?

解决setuptools动态读取模块版本报错的问题

问题根源

执行pip install -e .时,setuptools会在临时构建环境中导入你的模块以读取__VERSION__,但此时当前工作目录并非项目根目录,导致open("VERSION.TXT")找不到文件,__VERSION__未被正确赋值,从而抛出AttributeError。

解决办法

方案一:修正VERSION.TXT的读取路径(推荐)

修改ranchercli/ranchercli.py中的版本读取代码,基于模块文件的位置定位VERSION.TXT,确保无论在什么环境下都能找到文件:

import os

# 基于模块所在目录定位项目根目录下的VERSION.TXT
version_file_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "VERSION.TXT")
__VERSION__ = open(os.path.abspath(version_file_path), "r").read().strip()

这里用os.path.dirname(__file__)获取ranchercli.py的所在目录,再向上一级得到项目根目录,拼接VERSION.TXT的路径,最后用os.path.abspath标准化路径,彻底避免相对路径的问题。

方案二:构建时同步VERSION.TXT到临时环境

如果不想修改代码,可以在pyproject.toml中添加配置,让setuptools在构建时将VERSION.TXT复制到临时环境的对应位置:

[project]
name = "ranchercli"
dynamic = ["version"]

[tool.setuptools.dynamic]
version = {attr = "ranchercli.ranchercli.__VERSION__"}

[tool.setuptools]
package-data = {"" = ["VERSION.TXT"]}
include-package-data = true

这种方式会把项目根目录的VERSION.TXT打包进安装包,确保构建环境中能访问到文件。

方案三:改用Git自动生成版本(替代方案)

既然你已经用Git提交钩子维护版本,可直接使用setuptools-scm从Git标签自动生成版本,无需手动维护VERSION.TXT:

  1. 安装依赖:pip install setuptools-scm
  2. 修改pyproject.toml配置:
[project]
name = "ranchercli"
dynamic = ["version"]

[tool.setuptools.dynamic]
version = {scm = true}

[tool.setuptools-scm]
root = "."
version_scheme = "guess-next-dev"
local_scheme = "dirty-tag"

这种方式完全自动化,能根据Git标签、提交记录自动生成符合规范的版本号。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 10:28:10