You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从DNF或rpmdb获取Fedora下RPM包的下载URL

我懂你想要用Python实现和dnf download --url一模一样的功能,而且还碰到了导入dnf/rpm模块失败的问题。下面给你两个实用的解决方案,你可以根据自己的需求选:

方案1:直接调用dnf命令行(最简单省心的方式)

有时候导入dnf模块会因为环境(比如用了虚拟环境而非系统Python)或者权限问题卡壳,直接调用系统的dnf命令反而最稳妥。用Python的subprocess模块就能轻松实现,代码逻辑和你手动敲命令完全一致:

import subprocess

def get_rpm_download_url(package_name):
    try:
        # 执行dnf download --url命令,捕获输出
        result = subprocess.run(
            ['dnf', 'download', '--url', package_name],
            capture_output=True,
            text=True,
            check=True
        )
        # 把输出按行拆分,每一行就是一个包的下载URL
        return result.stdout.strip().split('\n')
    except subprocess.CalledProcessError as e:
        print(f"获取URL失败啦: {e.stderr}")
        return None

# 测试一下
if __name__ == "__main__":
    package_urls = get_rpm_download_url("xterm")
    if package_urls:
        for url in package_urls:
            print(url)

这个方法不需要折腾模块导入,只要你的系统能正常运行dnf命令,就能用。如果需要指定架构或者版本,直接给dnf加参数就行,比如['dnf', 'download', '--url', '--arch=x86_64', package_name]。

方案2:解决dnf模块导入问题(想用Python API的话)

如果你坚持要直接用dnf的Python模块,那得先解决导入失败的问题:

  • 必须用Fedora自带的系统Python(路径是/usr/bin/python3),第三方虚拟环境里的Python默认没有dnf模块;
  • 确保安装了python3-dnf包,没装的话跑sudo dnf install python3-dnf补一下。

搞定环境后,就可以用dnf的官方API来获取URL了,逻辑和dnf命令是一致的:

import dnf
import sys

def get_rpm_url_via_dnf_api(package_name):
    # 初始化dnf基础对象
    dnf_base = dnf.Base()
    # 加载系统所有仓库
    dnf_base.read_all_repos()
    dnf_base.fill_sack()

    # 查询指定包的最新版本
    pkg_query = dnf_base.sack.query()
    target_pkgs = pkg_query.filter(name=package_name).latest().run()
    
    if not target_pkgs:
        print(f"找不到包 {package_name} 哦")
        return None
    
    # 提取每个包的下载URL
    download_urls = []
    for pkg in target_pkgs:
        download_urls.append(pkg.remote_location())
    
    return download_urls

# 示例用法
if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("用法: python3 get_rpm_url.py <要查询的包名>")
        sys.exit(1)
    urls = get_rpm_url_via_dnf_api(sys.argv[1])
    if urls:
        for url in urls:
            print(url)

注意:这个方法有时候需要root权限才能访问某些仓库,如果运行时报权限错误,记得用sudo执行脚本。

内容的提问来源于stack exchange,提问作者MysticDog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:26:05