使用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:
- 安装依赖:
pip install setuptools-scm - 修改
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
相关产品推荐
相关产品推荐

