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

时间:2011-12-08 23:13:52

标签: python linux rpm yum

TLDR ;我需要简单的Python调用给定包名称(例如,' make')以查看它是否已安装;如果没有,安装它(我可以做后一部分)。

问题:

所以在http://yum.baseurl.org/wiki/YumCodeSnippets中给出了一些代码示例,但除了在ipython内部克服并猜测每个方法的作用之外,似乎没有任何用于Python API的实际文档。百胜。它显然都是部落知识。

[edit] 显然我只是偶然发现了 API文档(当然,在收到可接受的答案后)。它没有从主页面链接,但此处是供将来参考:http://yum.baseurl.org/api/yum/

我需要做什么:

我有一个部署配置脚本,它依赖于其他系统包(make,gcc等)。我知道我可以像这样安装它们:http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction但是我希望在这样做之前可以选择查询它们是否已经安装,所以我可以选择其他选项包裹不存在而不是强制安装。要做到这一点的正确要求是什么(或者更好,有没有人真正打扰在代码示例之外正确记录API?)

我在这个项目之前从未接触过Python,我真的很喜欢它,但是......有些模块文档比独角兽骑行的妖精更难以捉摸。

4 个答案:

答案 0 :(得分:17)

import yum

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

答案 1 :(得分:1)

您可以在子系统上运行'which'来查看系统是否包含您要查找的二进制文件:

import os
os.system("which gcc")
os.system("which obscurepackagenotgoingtobefound")

答案 2 :(得分: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()

答案 3 :(得分:0)

import yum

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