使用Yum Python API确定软件包是否已安装?

9
TLDR; 我需要一个简单的Python调用,给定包名(例如,“make”)来查看它是否安装;如果没有安装,则安装它(我可以做后半部分)。
问题:所以在http://yum.baseurl.org/wiki/YumCodeSnippets中提供了一些代码示例,但除了在ipython中进行猜测并猜测每个方法的作用外,似乎没有任何实际的yum Python API文档。显然,这都是部落知识。
【编辑】:显然,我只是偶然发现了API文档(在收到可接受的答案之后,当然)。它没有链接到主页面,但这里是将来的参考:http://yum.baseurl.org/api/yum/ 我需要做什么:我有一个依赖于其他系统包(make、gcc等)的部署配置脚本。我知道我可以像这样安装它们:http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction,但我想有一个选项来查询它们是否已经安装,这样我就可以有额外的选择,如果这些包不存在,就可以简单地失败而不是强制安装。如何正确调用此功能(或更好的是,是否有人真正费心在代码示例之外适当地记录API文档?)
我以前从未接触过Python,现在我真的很喜欢它,但是...其中一些模块文档比骑独角兽的小矮人还难找。

1
你尝试过从你提供的网页链接中使用 YumSearch 代码片段吗? - David Z
是的,但它提供的结果似乎没有给我任何已安装状态的指示——只是rpmdb是否知道该软件包(基于指定字段的部分文本匹配)。也许我用错了方法。 - Aaron Burke
4个回答

19
import yum

yb = yum.YumBase()
if yb.rpmdb.searchNevra(name='make'):
   print "installed"
else:
   print "not installed"

谢谢;我知道这一定是某件简单的事情。我进行了合理性检查,所有看起来都很好! - Aaron Burke

2
您可以在子系统上运行“which”命令,以查看系统是否具有您正在寻找的二进制文件:
import os
os.system("which gcc")
os.system("which obscurepackagenotgoingtobefound")

1
我这样做是为了确定我的产品是否已经安装(即升级场景),尽管我希望有一个更“纯粹”的Python方法。 which 方法肯定有效,但这既是一个学习练习,也是一个实际问题。:编辑:我无法使其正确格式化,但这就是我这样做的方式devnull = open(os.devnull, "w") ret = subprocess.call(["which", "myapp"], stdout=devnull, stderr=subprocess.STDOUT, shell=True) devnull.close() # 如果“which”找到“myapp”,则返回代码为0(成功);否则返回1(未找到) - Aaron Burke

1

对于以后偶然发现这篇文章的任何人,这是我想出来的。请注意,“testing”和“skip_install”是我从脚本调用中解析出来的标志。

    print "Checking for prerequisites (Apache, PHP + PHP development, autoconf, make, gcc)"
    prereqs = list("httpd", "php", "php-devel", "autoconf", "make", "gcc")

    missing_packages = set()
    for package in prereqs:
        print "Checking for {0}... ".format([package]),

        # Search the RPM database to check if the package is installed
        res = yb.rpmdb.searchNevra(name=package)
        if res:
            for pkg in res:
                print pkg, "installed!"
        else:
            missing_packages.add(package)
            print package, "not installed!"
            # Install the package if missing
            if not skip_install:
                if testing:
                    print "TEST- mock install ", package
                else:
                    try:
                        yb.install(name=package)
                    except yum.Errors.InstallError, err:
                        print >> sys.stderr, "Failed during install of {0} package!".format(package)
                        print >> sys.stderr, str(err)
                        sys.exit(1)

    # Done processing all package requirements, resolve dependencies and finalize transaction
    if len(missing_packages) > 0:
        if skip_install:
            # Package not installed and set to not install, so fail
            print >> sys.stderr, "Please install the {0} packages and try again.".format(
                ",".join(str(name) for name in missing_packages))
            sys.exit(1)
        else:
            if testing:
                print "TEST- mock resolve deps and process transaction"
            else:
                yb.resolveDeps()
                yb.processTransaction()

0
import yum

yb = yum.YumBase()
yb.isPackageInstalled('make')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接