当前位置: 首页 > news >正文

解决openEuler/KylinOS/CentOS9/Rocky9上python2.7无法加载rpm模块的问题

经过几天几夜的底层库依赖重构,终于整理出了一套不破坏系统环境运行Python2.7运行包的方案

由于涉及的二进制库较多且有特定的加载顺序,无法在博文中一一列出
如按本文操作时报了错请自行排查,如需帮助

# 在centos7上
[root@localhost ~]# python2 --version
Python 2.7.5适用场景:Rocky9已经彻底删除了Python 2,但客户有个科研脚本或老旧工具必须依赖Python 2.7及其特定版本的C扩展库
1. 策略:构建“离散式”运行环境
不要试图在 Rocky 9 系统层安装Python 2,要采用完全隔离的目录安装# 提取基础环境
最好的办法是从一台CentOS7上打包现成的环境:
# 在CentOS 7上执行
[root@localhost ~]# tar -czvf python27_base.tar.gz  /usr/bin/python2.7 /usr/lib64/python2.7  /usr/include/python2.7
[root@localhost ~]# ls -alh python27_base.tar.gz 
-rw-r--r-- 1 root root 7.7M 5月   8 19:57 python27_base.tar.gz# 发送到rocky9上
[root@localhost ~]# scp python27_base.tar.gz root@172.16.186.140:~# 在rocky9上
[root@localhost ~]# mkdir -p /opt/py2_legacy在Rocky9上创建一个专门放 Pytho 2依赖库的文件夹,避免与系统 /lib64 混淆:
[root@localhost ~]# mkdir -p /opt/py2_legacy/libs
[root@localhost ~]# tar -xzvf python27_base.tar.gz -C /opt/py2_legacy/# 完整地找到缺失的库
[root@rocky9 ~]# ldd /opt/py2_legacy/usr/bin/python2.7linux-vdso.so.1 (0x00007ffc1d4ce000)libpython2.7.so.1.0 => not foundlibpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2509c16000)libdl.so.2 => /lib64/libdl.so.2 (0x00007f2509c11000)libutil.so.1 => /lib64/libutil.so.1 (0x00007f2509c0c000)libm.so.6 => /lib64/libm.so.6 (0x00007f2509b31000)libc.so.6 => /lib64/libc.so.6 (0x00007f2509800000)/lib64/ld-linux-x86-64.so.2 (0x00007f2509c21000)Python很多功能(如SSL,MySQL,XML)是靠.so格式的扩展模块实现的。也需要检查它们:
# 扫描所有 Python 扩展模块是否缺库
[root@rocky9 ~]# find /opt/py2_legacy/usr/lib64/python2.7/lib-dynload/ -name "*.so" | xargs ldd | grep "not found"libnsl.so.1 => not foundlibpython2.7.so.1.0 => not foundlibpanelw.so.5 => not foundlibncursesw.so.5 => not foundlibtinfo.so.5 => not foundlibpython2.7.so.1.0 => not foundlibssl.so.10 => not foundlibcrypto.so.10 => not foundlibpython2.7.so.1.0 => not foundlibffi.so.6 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibgdbm.so.4 => not foundlibreadline.so.6 => not foundlibtinfo.so.5 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not foundlibpython2.7.so.1.0 => not found[root@localhost ~]# yum install mlocate -y
[root@localhost ~]# updatedb# 定义缺失库列表
MISSING_LIBS="libnsl.so.1 libpython2.7.so.1.0 libpanelw.so.5 libncursesw.so.5 libtinfo.so.5
libssl.so.10 libcrypto.so.10 libffi.so.6 libgdbm.so.4 libreadline.so.6
libssl.so.10
libtinfo.so.5
libdbus-glib-1.so.2
liblua-5.1.so
libnss3.so
librpm.so.3
libnssutil3.so
libplc4.so
libnspr4.so
liblzma.so.5
libselinux.so.1
libsepol.so.1
libnssutil3.so
"[root@localhost ~]# mkdir -p /tmp/py27_libs_collect
[root@localhost ~]# for lib in $(cat need_libs.txt); dopath=$(find /usr/lib64 /lib64 /usr/lib /lib -name "$lib" 2>/dev/null | head -n 1)if [ -n "$path" ]; thencp -L "$path" /tmp/py27_libs_collect/fi
done[root@localhost ~]# ls /tmp/py27_libs_collect
libcrypto.so.10  libgdbm.so.4      libnsl.so.1     libssl.so.10
libffi.so.6      libncursesw.so.5  libpanelw.so.5  libtinfo.so.5# 打包
[root@localhost ~]# tar -czvf py27_missing_libs.tar.gz -C /tmp/py27_libs_collect .# 发送到rocky9上
[root@localhost ~]# scp py27_missing_libs.tar.gz root@172.16.186.140:~# 在rocky9上解压到/opt/py2_legacy/libs目录下
[root@rocky9 ~]# tar -zxvf py27_missing_libs.tar.gz -C /opt/py2_legacy/libs# 因为上一条命令输出为空,即正常,所以现在能查看python版本
[root@rocky9 ~]# LD_LIBRARY_PATH=/opt/py2_legacy/libs /opt/py2_legacy/usr/bin/python2.7 --version
Python 2.7.5            # 这一行是输出# 编写标准化启动脚本 (The Wrapper)
你需要创建一个全局命令,让它像原生程序一样好用
[root@rocky9 ~]# vim /usr/local/bin/python27
#!/bin/bash# 强制指定旧版库路径export LD_LIDRARY_PATH="/opt/py2_legacy/libs:$LD_LIBRARY_PATH"# 执行隔离目录下的 python 2.7 并透传所有参数exec /opt/py2_legacy/usr/bin/python2.7 "$@"[root@rocky9 ~]# chmod +x /usr/local/bin/python27
[root@rocky9 ~]# python
python     python27   python3    python3.9  # 测试SSL(旧版Python最容易在现代OS上挂掉的地方)
[root@rocky9 ~]# python27 -c "import ssl; print('SSL: OK')"
SSL: OK# 测试加密库
[root@rocky9 ~]# python27 -c "import hashlib; print('Hashlib: OK')"
Hashlib: OK# 测试数据库连接(如果有安装MySQLdb等模块)
[root@rocky9 ~]# python27 -c "import socket; print('Socket: OK')"
Socket: OK# Pip迁移(可选)
如果应用需要安装新的第三方库,Python 2.7 的 pip 大多已经无法连接现代镜像站# 在Rocky9上解压到对应目录
# 注意:确保路径 /opt/py2_legacy/usr/lib64/python2.7/ 已经存在,本次实验是有/opt/py2_legacy/usr/lib64/python2.7/site-packages/这个目录,且里面非空
因为在你最初解压 python27_base.tar.gz 时,这个目录作为 Python 标准安装结构的一部分已经被创建了
里面的内容通常是 Python 自带的一些基础工具(比如README、setuptools、pip的原始文件等)# 扫描site-packages里的"隐藏依赖"
这些第三方库是“二次依赖”的高发区。请执行这个深度扫描:
[root@rocky9 ~]# find /opt/py2_legacy/usr/lib64/python2.7/site-packages/ -name "*.so" | xargs -I {} sh -c "LD_LIBRARY_PATH=/opt/py2_legacy/libs ldd {}" | grep "not found" | awk '{print $1}' | sort | uniq# 跨越了最难的兼容性大山
[root@rocky9 ~]# python27 -c "import rpm; print('Success')"
Success# 给所有 site-packages 下的扩展模块加上可执行权限
[root@rocky9 ~]# find /opt/py2_legacy/usr/lib64/python2.7/site-packages/ -name "*.so" -exec chmod +x {} +# 检查当前环境加载的所有库中,是否同时出现了同一个库的两个大版本
[root@rocky9 ~]# LD_LIBRARY_PATH=/opt/py2_legacy/libs python27 -c "import rpm; import ssl; import socket; print('Link check passed')"
Link check passed              # 回显# 用python27 your_script.py运行自己的脚本大概率会报错,原因在于之前的 import rpm 成功是建立在手动设置了环境变量的基础上的。如果直接运行,系统会找不到你搬运的那些旧版 .so 库和 site-packages 路径
[root@rocky9 ~]# python27 --version
Python 2.7.5[root@rocky9 ~]# python27 -c "import rpm; import ssl; print('Everything is OK')"
Everything is OK[root@rocky9 ~]# python27 -c "import urllib; print(urllib.urlopen('https://www.qq.com').getcode())"
200
http://www.jsqmd.com/news/784675/

相关文章:

  • 即梦怎么去除水印?即梦去除水印教程与方法全解析,2026最新 亲测好用 - 爱上科技热点
  • CANN/Ascend C原子比较交换API
  • 短视频在线解析去水印怎么做?多种解析方法与2026最新工具实测推荐 - 爱上科技热点
  • 2026年再生塑料颗粒回收公司最新推荐榜:PE再生颗粒/农膜再生颗粒/改性塑料颗粒/管道专用颗粒回收 - 海棠依旧大
  • 如何3步免费将网易云NCM音乐文件转换为MP3格式:终极解决方案
  • 观察Taotoken平台账单明细实现精准的API成本管理
  • 2026年性价比之选:啄木鸟漆业包砂/水包砂实力厂家 - 奔跑123
  • 佛山黄金回收不压价?收的顶本地深耕更懂市民需求 - 奢侈品回收测评
  • SwiftUI Pro Agent Skill:提升AI生成代码质量的专业技能包
  • LeetCode 单词搜索题解
  • 即梦怎么去除水印?即梦去除水印教程+方法汇总,2026最新实测有效 - 爱上科技热点
  • 区块链与AI融合构建社会DAO:性勒索协同治理网络的技术架构与实践
  • 2026年重庆公司注册避坑指南:这5家服务商谁才是性价比之王! - 果果1998
  • CANN 填充梯度算子
  • 即梦视频怎样去水印?手机版使用方法和工具推荐|2026最新 实测教程 - 爱上科技热点
  • AI赋能教育:构建个性化自适应学习系统的技术架构与实战
  • 基于GPT的Python 2到3代码迁移:原理、实践与避坑指南
  • 华为CANN/opbase OP_OUTSHAPE宏
  • 2026卖家精灵优惠折扣码更新 跨境新手必看帮你少走弯路 - 李先生sir
  • 企业级AI决策系统实战:从知识图谱到多智能体协作的架构演进
  • 智能游戏助手:解放星穹铁道日常任务的终极效率方案
  • DevChat:AI编程助手如何无缝集成IDE,提升开发效率与代码质量
  • 自动驾驶AI算法演进:从L0到L5的技术跃迁与工程挑战
  • CANN/metadef GenerateTask接口
  • 强力破解Windows热键冲突:Hotkey Detective一键定位占用程序
  • 即梦视频怎么去水印?即梦如何无损下载?2026最新 去水印工具与方法实测指南 - 爱上科技热点
  • 强化学习优化量子反馈控制:从麦克斯韦妖到量子热机设计
  • CANN/driver设备故障查询API
  • 突破性技术方案:MyTV-Android实现安卓低版本系统流畅直播体验架构解析
  • Oumuamua-7b-RP效果展示:温度0.3 vs 1.2下角色性格稳定性对比实测