Определить, установлен ли пакет с Yum Python API?

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

Проблема:

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

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

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

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

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


person Aaron Burke    schedule 08.12.2011    source источник
comment
Пробовали ли вы фрагмент YumSearch с веб-страницы, на которую вы ссылаетесь?   -  person David Z    schedule 09.12.2011
comment
Да, но результаты этого, похоже, не дали мне никаких указаний на статус установки - только на то, знал ли rpmdb о пакете (на основе частичного совпадения текста в указанных полях). Может быть, я делаю это неправильно.   -  person Aaron Burke    schedule 10.12.2011


Ответы (3)


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

import os
os.system("which gcc")
os.system("which obscurepackagenotgoingtobefound")
person eclipse    schedule 09.12.2011
comment
Я делаю это, чтобы определить, установлен ли уже мой продукт (т. е. сценарий обновления), хотя я надеялся на более чистый подход Python. Подход which определенно сработает, но это не только практическое упражнение, но и учебное. :edit: Я не могу правильно отформатировать это, но я делаю это так: devnull = open(os.devnull, w) ret = subprocess.call([what, myapp], stdout=devnull, stderr=subprocess. STDOUT, shell=True) devnull.close() # Код возврата 0 (успех), если был найден myapp; иначе возвращает 1 (не найдено) - person Aaron Burke; 10.12.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()
person Aaron Burke    schedule 09.12.2011

person    schedule
comment
Спасибо; Я знал, что это должно быть что-то простое. Я в здравом уме проверил это, и все выглядит хорошо! - person Aaron Burke; 10.12.2011