Определить, установлен ли пакет с Yum Python API? - PullRequest
8 голосов
/ 09 декабря 2011

TLDR ;Мне нужен простой вызов Python с именем пакета (например, 'make'), чтобы увидеть, установлен ли он;если нет, установите его (я могу выполнить последнюю часть).

Проблема:

Итак, в http://yum.baseurl.org/wiki/YumCodeSnippets, приведено несколько примеров кода, ноКроме того, что мы не спотыкаемся внутри ipython и не догадываемся о том, что делает каждый метод, похоже, нет никакой реальной документации по Python API для yum.Это, очевидно, все племенные знания.

[править] Очевидно, я просто случайно обнаружил документацию API (после получения приемлемого ответа, конечно).Он не связан с главной страницей, но здесь для дальнейшего использования: http://yum.baseurl.org/api/yum/

Что мне нужно сделать:

У меня есть сценарий конфигурации развертывания, которыйполагается на другие системные пакеты (make, gcc и т. д.).Я знаю, что могу установить их так: http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction, но я бы хотел иметь возможность запросить, если они уже установлены, прежде чем сделать это, поэтому я могу иметь дополнительную опцию простого сбоя, если пакеты ненет вместо принудительной установки.Как правильно это сделать (или, что еще лучше, кто-нибудь вообще потрудился правильно документировать API вне примеров кода?)

До этого проекта я никогда не касался Python, и мне действительно это нравится, но ... часть документации по модулю более неуловима, чем гномы-единороги.

Ответы [ 4 ]

17 голосов
/ 10 декабря 2011
import yum

yb = yum.YumBase()
if yb.rpmdb.searchNevra(name='make'):
   print "installed"
else:
   print "not installed"
1 голос
/ 10 декабря 2011

Для тех, кто наткнулся на этот пост позже, вот что я придумал.Обратите внимание, что «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()
1 голос
/ 09 декабря 2011

Вы можете запустить 'which' в подсистеме, чтобы увидеть, есть ли в системе искомые двоичные файлы:

import os
os.system("which gcc")
os.system("which obscurepackagenotgoingtobefound")
0 голосов
/ 06 ноября 2018
import yum

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