9

TLDR ; インストールされているかどうかを確認するには、パッケージ名 (「make」など) を指定して単純な Python 呼び出しを行う必要があります。そうでない場合は、インストールします(後半はできます)。

問題:

したがって、 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 に触れたことがなく、とても気に入っていますが...モジュールのドキュメントのいくつかは、ユニコーンに乗ったレプラコーンよりもとらえどころのないものです。

4

4 に答える 4

19
import yum

yb = yum.YumBase()
if yb.rpmdb.searchNevra(name='make'):
   print "installed"
else:
   print "not installed"
于 2011-12-09T20:40:11.420 に答える
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()
于 2011-12-09T23:57:17.620 に答える