我构建的Python RPM赢得了';安装

我构建的Python RPM赢得了';安装,python,rpm,rpmbuild,rpm-spec,Python,Rpm,Rpmbuild,Rpm Spec,因为我必须在通过kickstart进程构建的多个Oracle Linux服务器上安装多个版本的Python,所以我想为我们的yum存储库构建一个Python rpm。我能够使用“makealtinstall”手动构建Python,它不会在默认的系统Python安装上安装,所以我认为这是一种方法 经过多次尝试和错误,我成功地以.bz2 python 2.7包开始构建了一个rpm—但现在当我尝试安装它时,我遇到了一个错误: error: Failed dependencies: /usr/l

因为我必须在通过kickstart进程构建的多个Oracle Linux服务器上安装多个版本的Python,所以我想为我们的yum存储库构建一个Python rpm。我能够使用“makealtinstall”手动构建Python,它不会在默认的系统Python安装上安装,所以我认为这是一种方法

经过多次尝试和错误,我成功地以.bz2 python 2.7包开始构建了一个rpm—但现在当我尝试安装它时,我遇到了一个错误:

error: Failed dependencies:
    /usr/local/bin/python is needed by Python-2.7.2-1.i386
什么。。。???Python就是我要安装的!!!系统默认Python(2.4)位于/usr/bin/Python中!!!python目录的原型位置是/tmp/python2.7(可执行文件是/tmp/python2.7/bin/python2.7)。那么为什么它要在/usr/local/bin中查找呢

以下是我的RPM规范的核心:

%prep
%setup -q

%build
./configure --prefix=/tmp/python2.7
make

%install

make altinstall
我仔细查看rpm构建日志,发现:

Requires: /bin/sh /tmp/python2.7/bin/python2.7 /usr/bin/env /usr/local/bin/python libc.so.6 libc.so.6(GLIBC_2.0)...[a lot more...]
好的,这就是/usr/local/bin的作用。。。现在的问题是,它如何确定这些要求?我指定了什么错误吗?我需要重写什么吗

像许多rpm新手一样,我得到了构建部分,但我并不真正“了解”在rpmbuild结束时发生的事情,以及在rpm文件中实际输入的内容(在%files中指定的文件除外),以及在安装rpm时实际发生的事情


有人能告诉我为什么我的安装失败了,或者我读了什么来理解为什么我的rpm构建需要我尝试构建的东西吗?

rpmbuild可以变得非常智能,这就是其中之一。它可能从包含以下内容的脚本文件中提取了
/usr/local/bin/python

#!/usr/local/bin/python

在顶端。请尝试在bz2文件中的文件中搜索此路径

您应该能够通过向spec文件中添加以下行来解决此问题:

以下是我对为什么这是必要的理解。当rpmbuild在带有#的.py文件上运行时!(shebang)它将自动添加shebang指定为需求的二进制文件。不仅如此,如果shebang是
#/usr/bin/env python
,它将为解析为的任何内容添加依赖项(在
$PATH
上的第一个python)


您或者需要关闭自动需求处理,或者找到所有会导致问题的shebang并将其更改为其他内容。

有两种方法——但是,如果我不需要的话,我不想破坏源代码,因为%setup正在从原始下载文件中解包它们--有没有办法解决这个问题?这是正确的答案。在python源代码中,有一个带有shebang行的文件,其中包含
/usr/local/bin/python
@Ilane,正确的做法是为源代码编写补丁。构建RPM的一个标准部分是编写补丁。您将注意到,在包含令人不快的shebang的文件中,有一条注释,大意是python打包程序如果不将python安装到
/usr/local
,则需要编写修补程序。具体而言,问题是
cgi.py
。Fedora规范(,)通过运行
Tools/scripts/pathfix.py
来修复此问题。在这种情况下,您不想关闭依赖项处理。这可能会破坏python包,因为RPM不知道包所依赖的so文件。正确的做法是修补包含错误shebang行的文件。在大多数情况下,我同意,但这不是包含Python脚本的任意RPM,而是Python安装(二进制文件将安装到/usr/local/bin)。这无关紧要。如果禁用此功能,RPM仍将无法正确处理依赖项。若要在使用
AutoReq:no
选项的同时保持正确的依赖项,请在成功生成期间复制
Requires:
rpmbuild
输出,粘贴到
.spec
文件中,然后重新生成。只需确保从Requires列表中删除麻烦的部分(例如/path/to/python)。然后,将检查所需的库等,但不会检查提供的python可执行文件。
AutoReq: no