由于我们的应用程序与 兼容python2
,因此我们需要迁移到 RHEL 8
在 RHEL 8 机器上安装后python2
,我们看到以下内容:
rpm -qa | grep python2
python2-pip-9.0.3-19.module+el8.6.0+13001+ad200bd9.noarch
python2-setuptools-wheel-39.0.1-13.module+el8.4.0+9442+27d0e81c.noarch
python2-pip-wheel-9.0.3-19.module+el8.6.0+13001+ad200bd9.noarch
python2-2.7.18-11.module+el8.7.0+15681+7a92afba.x86_64
python2-libs-2.7.18-11.module+el8.7.0+15681+7a92afba.x86_64
python2-setuptools-39.0.1-13.module+el8.4.0+9442+27d0e81c.noarch
但是当我们尝试使用时import yum
,我们收到有关“没有名为 yum 的模块”的错误,并显示以下输出:
python
Python 2.7.18 (default, Jun 17 2022, 07:56:00)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import yum
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named yum
yum 安装的 rpm 包括:
rpm -qa | grep yum
yum-4.4.2-11.el8.noarch
yum-utils-4.0.18-4.el8.noarch
yum 显示为:
more /usr/bin/yum
#!/usr/bin/python
import sys
try:
import yum
except ImportError:
print >> sys.stderr, """\
There was a problem importing one of the Python modules
required to run yum. The error leading to this problem was:
%s
Please install a package which provides this module, or
verify that the module is installed correctly.
It's possible that the above module doesn't match the
current version of Python, which is:
%s
If you cannot solve this problem yourself, please go to
the yum faq at:
http://yum.baseurl.org/wiki/Faq
""" % (sys.exc_value, sys.version)
sys.exit(1)
sys.path.insert(0, '/usr/share/yum-cli')
try:
import yummain
yummain.user_main(sys.argv[1:], exit_code=True)
except KeyboardInterrupt, e:
print >> sys.stderr, "\n\nExiting on user cancel."
sys.exit(1)
从pip2
列表中我们得到以下输出:
pip2 list
pip (9.0.3)
setuptools (39.0.1)
那么我们为什么会收到错误呢 No module named yum
?
https://www.getpagespeed.com/solutions/python-scripts-running-on-rocky-linux-8-can-not-import-yum
答案1
在看完StackO 问题一个简单的修复可能是对 进行更改/usr/bin/yum
。将第一行更改!#/usr/bin/python
为!#/usr/bin/python2.7
还有一种更近期但更复杂的RHEL 客户门户解决方案自 2023 年 4 月 25 日起。
决议
此问题可能有多种原因。通常,此问题是由于 python 路径设置不正确造成的。python 路径 sys.path 是在 python 初始化期间使用多种方法动态构建的,因此根据相关系统,修复方法可能是以下之一:
解决方案 1
取消设置 PYTHONHOME 变量:
# unset PYTHONHOME
要永久更改,请从 root 的 .bashrc 或 .bash_profile 中删除条目(如果存在)。
通过运行以下命令重新安装 python 包:
# rpm -Uvh --replacefiles --replacepkgs python-<version>.rpm
解决方案 2
如果没有设置 PYTHONHOME 变量,请检查以确保没有第三方 python 位于不正确的 /lib/ 位置而不是 /lib64/ 下。检查 python 路径以及 ldd 以查看正在加载哪些文件:
# python -c "import sys; print(sys.path)" ['',
'/usr/lib64/python27.zip', '/usr/lib64/python2.7',
'/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk',
'/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
'/usr/lib64/python2.7/site-packages',
'/usr/lib/python2.7/site-packages']
# ldd /usr/bin/python
linux-vdso.so.1 => (0x00007ffd46b3b000)
libpython2.7.so.1.0 => /lib64/libpython2.7.so.1.0 (0x00007efe38aaf000) <-----take note of this file location
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007efe38893000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007efe3868f000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007efe3848c000)
libm.so.6 => /lib64/libm.so.6 (0x00007efe3818a000)
libc.so.6 => /lib64/libc.so.6 (0x00007efe37dbc000)
/lib64/ld-linux-x86-64.so.2 (0x00007efe38e7b000)
上面的输出表明了预期结果。如果您看到加载了 /usr/lib/python2.7 而不是 /usr/lib64/python2.7,则应检查以下内容:
# ls -l /lib/libpython2.7.so.1.0
# rpm -qf /lib/libpython2.7.so.1.0
如果您发现 /lib/libpython2.7.so.1.0 中有一个文件,但该文件不属于任何包,则您应该将该文件移到一边,看看问题是否仍然存在:
# mv /lib/libpython2.7.so.1.0 /tmp/
优先的python也可能在/root/.local,所以请确保该路径下没有python。
根本原因)
- PYTHONHOME 变量被设置为系统上的环境变量。
- Python 库/文件已被修改,可以从 rpm -Va 命令的输出中观察到。
- 系统上安装了第三方 python 模块,可以在 ldd /usr/bin/python 命令的输出中找到。
- 软件包 rpm-python* 未安装。
- 正在加载第三方 /lib/libpython2.7.so.1.0,而不是正确的系统位置 /lib64/libpython2.7.so.1.0。这会导致 sys.path 定义的 Python 模块搜索路径设置不正确,从而导致系统找不到已安装的 Python 模块