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

在RPM包.spec文件中打包多版本Python3失败问题排查

问题分析与修复方案

核心问题

你的.spec文件存在三个关键问题,导致Python 3.9版本的包无法生成:

  1. 变量覆盖:你先后定义python3_pkgversion为3.9和3.11,后面的定义直接覆盖了前面的值。到%files段时,该变量已经是3.11,导致两个%files指令都指向python3.11-my-fake-library包,而python3.9-my-fake-library没有对应的文件段,因此不会被打包。

  2. 未分版本构建/安装:%build和%install阶段仅使用最后设置的Python 3.11执行操作,两次%{py3_install}实际上都是用3.11安装的,生成的文件记录也都是3.11的内容,没有为3.9版本单独处理。

  3. 依赖未指定版本: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:23:25