在RPM包.spec文件中打包多版本Python3失败问题排查
问题分析与修复方案
核心问题
你的.spec文件存在三个关键问题,导致Python 3.9版本的包无法生成:
变量覆盖:你先后定义
python3_pkgversion为3.9和3.11,后面的定义直接覆盖了前面的值。到%files段时,该变量已经是3.11,导致两个%files指令都指向python3.11-my-fake-library包,而python3.9-my-fake-library没有对应的文件段,因此不会被打包。未分版本构建/安装:
%build和%install阶段仅使用最后设置的Python 3.11执行操作,两次%{py3_install}实际上都是用3.11安装的,生成的文件记录也都是3.11的内容,没有为3.9版本单独处理。依赖未指定版本:
python3-devel、python3-requests等依赖在RockyLinux 8中默认关联系统自带的Python 3.6,没有指定对应3.9/3.11版本的依赖,会导致构建或运行时错误。
修复后的.spec文件
%global underscore() %(echo %1 | sed 's/-/_/g') %global sum A simple python library for interacting with the Messaging APP %global desc A simple python library for interacting with the Messaging APP Name: my-fake-library Summary: %{sum} Version: 0.6.1 Release: 1%{?dist} Group: Development/Libraries License: ASL 2.0 URL: https://github.com/fake-git/my-fake-library.git Source0: %{name}-%{version}.tar.gz BuildArch: noarch %description %{desc} # Python 3.9 子包定义 %package -n python3.9-%{name} Obsoletes: fake-library Provides: fake-library Summary: %{sum} BuildRequires: python3.9-devel python3.9-setuptools Requires: python3.9-requests AutoReq: no %description -n python3.9-%{name} %{desc} %{?python_provide:%python3_provide python3-%{name}} # Python 3.11 子包定义 %package -n python3.11-%{name} Summary: %{sum} BuildRequires: python3.11-devel python3.11-setuptools Requires: python3.11-requests AutoReq: no %description -n python3.11-%{name} %{desc} %{?python_provide:%python3_provide python3-%{name}} %prep %setup -q %build # 分别为两个Python版本执行构建 %{__python3.9} setup.py build %{__python3.11} setup.py build %install rm -rf %{buildroot} # 分别安装到对应版本的site-lib目录,记录文件列表 %{__python3.9} setup.py install --root=%{buildroot} --record=INSTALLED_FILES_PY39 %{__python3.11} setup.py install --root=%{buildroot} --record=INSTALLED_FILES_PY311 # Python 3.9 包的文件段 %files -n python3.9-%{name} -f INSTALLED_FILES_PY39 %doc examples/ README.md %defattr(-,root,root,-) %{python3.9_sitelib}/* # Python 3.11 包的文件段 %files -n python3.11-%{name} -f INSTALLED_FILES_PY311 %doc examples/ README.md %defattr(-,root,root,-) %{python3.11_sitelib}/*
关键修改点说明
- 直接在子包名称、依赖中指定具体Python版本,避免变量覆盖问题。
- 构建/安装阶段分别调用
python3.9和python3.11的setup.py,确保每个版本的代码都被正确处理。 - 文件段分别对应各自的子包,使用
python3.9_sitelib、python3.11_sitelib宏指定正确的安装路径,避免文件冲突。
内容的提问来源于stack exchange,提问作者dean89
相关产品推荐
相关产品推荐

