如何使用Python解析命令输出获取CentOS RPM包信息及依赖列表
Python实现CentOS RPM包字段解析与依赖列表提取
字段提取实现
针对RPM相关命令的标准输出,可通过正则匹配提取package(包名)、Arch(架构)、Version(版本)三类字段,适配rpm -qa、yum/dnf安装预览输出、依赖查询输出等常见场景,代码如下:
import re import subprocess from typing import List, Dict def parse_rpm_output(output_text: str) -> List[Dict]: pkg_result = [] # 匹配标准RPM输出格式:包名.架构 版本号 standard_pat = re.compile(r'^(\S+)\.(\S+)\s+(\S+)\s*$') # 匹配yum/dnf安装预览输出的包行格式 yum_install_pat = re.compile(r'--->\s+Package\s+(\S+)\.(\S+)\s+\S+\s+\S+\s+(\S+)') for line in output_text.splitlines(): line = line.strip() # 匹配标准格式行 std_match = standard_pat.match(line) if std_match: pkg_name, arch, version = std_match.groups() if arch in ["x86_64", "i686", "noarch", "aarch64"]: pkg_result.append({ "package": pkg_name, "Arch": arch, "Version": version }) continue # 匹配yum安装预览行 yum_match = yum_install_pat.match(line) if yum_match: pkg_name, arch, version = yum_match.groups() pkg_result.append({ "package": pkg_name, "Arch": arch, "Version": version }) return pkg_result
安装依赖列表获取
要获取CentOS下指定软件安装所需的全量RPM包列表,不需要实际执行安装,直接调用yum/dnf的dry run参数即可拉取全量依赖,不会对系统造成改动,封装方法如下:
def get_required_rpms(target_pkg: str, pkg_manager: str = "yum") -> List[Dict]: """ 获取目标软件安装所需的全部RPM包 :param target_pkg: 要安装的软件名,例如nginx、git :param pkg_manager: 包管理器,CentOS7填yum,CentOS8/Stream填dnf """ proc = subprocess.run( [pkg_manager, "install", target_pkg, "--assumeno"], capture_output=True, text=True ) # dry run存在需要安装的包时会返回非0退出码,属于正常场景,合并stdout和stderr解析 full_output = proc.stdout + proc.stderr return parse_rpm_output(full_output) # 调用示例 if __name__ == "__main__": rpm_list = get_required_rpms("nginx") for pkg in rpm_list: print(f"包名: {pkg['package']} | 架构: {pkg['Arch']} | 版本: {pkg['Version']}")
使用说明
- 如果需要解析系统已安装的全量RPM包,可直接执行
rpm -qa --qf '%{NAME}.%{ARCH} %{VERSION}-%{RELEASE}\n'获取格式化输出,解析准确率可达100%,无需做额外格式兼容 - 架构匹配列表可根据实际运行环境扩展,上述代码已覆盖主流x86、ARM、通用无架构包场景
- 若需要导出RPM文件用于离线安装,可搭配
yumdownloader --resolve <包名>命令直接下载所有依赖的RPM安装包
内容的提问来源于stack exchange,提问作者Dhaval Zala
相关产品推荐
相关产品推荐

