CentOS 7 上的 Python 3 上没有模块“yum”

Posted

技术标签:

【中文标题】CentOS 7 上的 Python 3 上没有模块“yum”【英文标题】:No module 'yum' on Python 3 on CentOS 7 【发布时间】:2020-04-02 19:09:10 【问题描述】:

我正在尝试在 CentOS 7 中使用 yum Python package。

Python 2中:我可以成功import yum

Python 3 中:当我尝试import yum 时,我遇到了ModuleNotFoundError: No module named 'yum'

安装 dnf 后,dnf Python package 也会出现完全相同的问题。

围绕这个问题的研究把我带到了 CentOS 8,其中dnf 包确实适用于 Python 3。 在 CentOS 7 中尝试查找 python3-dnf 软件包(或 yum 的等效软件包)时。 尝试在 CentOS 7 上安装 CentOS 8 软件包只会导致我与所需软件包发生冲突和不匹配。

另外,尝试pip3 install yum 找不到任何包,pip3 install dnf 成功但导入会给出以下警告:

/usr/local/lib/python3.6/site-packages/dnf.py:15: UserWarning: The DNF Python API is not currently available via PyPI.

Please install it with your distro package manager (typically called
'python2-dnf' or 'python3-dnf'), and ensure that any virtual environments
needing the API are configured to be able to see the system site packages
directory.

  warnings.warn(warning_msg)

所以,目前我无法找到一种方法来与 yum/dnf 在 CentOS 7 上运行 Python 3 的 Python 代码进行本机交互。

【问题讨论】:

【参考方案1】:

我的电脑运行 Fedora,我无法安装 CentOS,但我认为下面的信息是正确的。

您使用的yumdnf 模块不是您日常使用的pip 模块。相反,它们实际上是 dnfyum rpms 的一部分。

你可以这样检查:

Python2

>>> import yum
>>> help(yum)
(...)
FILE
    /usr/lib/python2.7/site-packages/yum/__init__.py

$ dnf -C repoquery --file /usr/lib/python2.7/site-packages/yum/__init__.py
yum-0:3.4.3-518.fc29.noarch

Python3

>>> import dnf
>>> help(dnf)
(...)
FILE
    /usr/lib/python3.7/site-packages/dnf/__init__.py

$ dnf -C repoquery --file     /usr/lib/python3.7/site-packages/dnf/__init__.py
python3-dnf-0:4.0.4-1.fc29.noarch
python3-dnf-0:4.2.5-5.fc29.noarch

如果您检查 yumdnf 文件,您会发现它们都是 python3 脚本

$ head -1 /usr/bin/yum /usr/bin/dnf
==> /usr/bin/yum <==
#!/usr/bin/python3

==> /usr/bin/dnf <==
#!/usr/bin/python3

如果您详细查看yum,您会发现它实际上是对dnf 模块的调用。

因此,Python 的 yumdnf 模块的可用性将取决于您安装的实际命令的版本。

对于dnf,可以尝试安装python2-dnfpython3-dnf。不过,我不确定您是否可以同时拥有它们。我想你可以,因为它们在 /usr/bin 中有不同的名称。

对于yum,我的猜测是他们提供了 Python 2 库以实现向后兼容性,但他们可能不会费心将其移至 Python 3,因为它已被 dnf 淘汰

同样,这对我的 Fedora 版本来说是正确的。你的 CentOS 版本可能会得到不同的结果和包名,但底线应该是一样的:Python2 lib only for yum;为不同的 Python 版本模块安装不同的 dnf 包。

【讨论】:

感谢您的详细回答,但不幸的是,这并不能解决 CentOS 7 中的问题。 @OrB,我想我的回答实际上是“对不起,你不能”。 yum/dnf 作为系统包安装,所以你必须使用系统提供的东西,显然在 CentOS 上它只提供 Python2 接口。为什么需要专门的 Python 3 绑定?你想达到什么目的?而且,你愿意破解它多远才能通过它?例如,您可以通过制作具有适当要求的virtualenv 并将 python3-dnf 包中的文件添加到其中来解决问题。但是你想去那里吗? 我特别想要 Python 3 绑定,因为 Python 2 将在 15 天后退役。看来您说这根本不可能是对的,所以目前我将通过为 Python 2 编写代码来解决它:( @caxcaxcoatl 我需要 Python 3,因为在 Python 2 上使用时,已知 Ansible 在具有大量文件指针的系统上非常慢。但我不能将 python 3 与 Ansible 一起使用来安装包我的 CentOS 7 系统带有 Yum 而不是 Dnf。这是我的一个难题。 @Gherman,好的,这是有道理的。我只是想仔细检查一下您是否尝试过 Python 3 + Ansible + package 模块。我不确定 Ansible 是使用库还是命令调用,所以可能值得一试,因为您只提到了 yum 模块。同样,如果这不起作用,这将是 DevOps 的一个有效问题

以上是关于CentOS 7 上的 Python 3 上没有模块“yum”的主要内容,如果未能解决你的问题,请参考以下文章

非root用户在centos上的python2.7

Bad Gateway 502 - 在 centos 7 上使用 gunicorn nginx 部署 Flask (python 3.5.2)

在 CentOS 7上安装并配置 Python 3.6 环境

在centos 7上安装并配置python 3.6环境,怎样使用3.6.1 版本

centos7.5误删python2.7之后,导致yum和Python命令无法使用

腾讯云下的CentOS7 安装最新版Python3.7.0