我构建的 Python RPM 无法安装

Posted

技术标签:

【中文标题】我构建的 Python RPM 无法安装【英文标题】:Python RPM I built won't install 【发布时间】:2011-11-17 09:47:18 【问题描述】:

因为我必须在通过 kickstart 过程构建的多个 Oracle Linux 服务器上安装多个版本的 Python,所以我想为我们的 yum 存储库构建一个 python rpm。我能够使用“make altinstall”手动构建 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 SPEC 的核心:

%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 构建需要我正在尝试构建的内容?

【问题讨论】:

【参考方案1】:

您应该能够通过将以下行添加到您的规范文件来解决此问题:

AutoReq: no

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

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

【讨论】:

在这种情况下你不想关闭依赖处理。这可能会破坏 python 包,因为 RPM 不知道该包依赖于什么文件。正确的做法是修补包含错误 shebang 行的文件。 在大多数情况下我会同意,但这不是包含 Python 脚本的任意 RPM,它是 Python 安装(二进制文件将安装到 /usr/local/bin)。跨度> 没关系。如果禁用此功能,RPM 仍将无法正确处理依赖关系。 要在使用AutoReq: no 选项的同时保持正确的依赖关系,请在成功构建期间从rpmbuild 复制Requires: 输出,粘贴到.spec 文件中,然后重新构建。只需确保从 Requires 列表中删除麻烦的部分(例如 /path/to/python)。然后,将检查所需的库等,但不会检查提供的 python 可执行文件。【参考方案2】:

rpmbuild 可以变得非常聪明,这就是其中一种情况。它可能从您的一个脚本文件中提取了/usr/local/bin/python,其中包含以下内容:

#!/usr/local/bin/python

在顶部。尝试在您的 bz2 文件中的文件中使用 grep 查找此路径。

【讨论】:

有两个——但是,如果我不需要,我不想弄乱源代码,因为 %setup 正在从原始下载文件中解压它们——有什么办法吗?这个问题? 这是正确答案。在 python 源代码中,有一个文件,其中 shebang 行包含/usr/local/bin/python。 @Ilane,正确的做法是为源代码编写补丁。构建 RPM 的一个标准部分是编写补丁。你会注意到在包含有问题的 shebang 的文件中,有一条注释表示如果 python 打包者不将 python 安装到/usr/local,则需要编写补丁。 具体问题是cgi.py。 Fedora 规范(python 3、python 2)通过运行Tools/scripts/pathfix.py 解决了这个问题。

以上是关于我构建的 Python RPM 无法安装的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Centos 6 上安装 RPM

rpm安装python

错误:无法为使用 PEP 517 且无法直接安装的 Kivy 构建***

错误:无法为 gevent 构建***,这是安装基于 pyproject.toml 的项目所必需的

无法在 Linux 上构建 PYQT

Python face_recognition 无法安装