2011-12-08 12 views
8

TLDR;インストールされているかどうかを確認するために、パッケージ名(例えば、 'make')を指定した単純なPython呼び出しが必要です。そうでない場合は、インストールしてください(私は後半部分もできます)。パッケージがYum Python APIと共にインストールされているかどうかを確認しますか?

問題:

だからhttp://yum.baseurl.org/wiki/YumCodeSnippetsに与えられたいくつかのコード例がありますが、ipythonの内側の周りkludgingと各メソッドが何をするかを推測以外の、のための任意の実際のドキュメントがあるように表示されません。 Python API for yum。それは明らかにすべての部族の知識です。

[編集]どうやら私は誤って(もちろん許容可能な答えを、受信後)APIドキュメントを発見しました。これは、メインページからリンクされているが、ここでは、今後の参考のためですないです。http://yum.baseurl.org/api/yum/

私がする必要がどのような:

私は、他のシステムパッケージ(作る、GCCに依存している展開構成スクリプトを持って、等。)。私はこれらのようにインストールすることができることを知っています:http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransactionしかし、そうする前に既にインストールされているかどうかを問い合わせるオプションがありますので、パッケージが存在しない場合は失敗するという追加オプションがありますインストールを強制する。

私はこのプロジェクトの前にPythonに触れたことはありませんでしたが、私は本当に好きですが、 ...モジュールドキュメンテーションのいくつかは、ユニコーン乗り物レフレクタよりも難解です。あなたは、システムが、あなたが探しているのバイナリがあるかどうかを確認するために、サブシステム上で「は」を実行することができ

+1

あなたがリンクしたウェブページから 'YumSearch'スニペットを試しましたか? –

+0

うん、それからの結果は、私にインストール状態の兆候を与えていないようでした - rpmdbは(指定したフィールドのテキストの部分一致に基づいて)パッケージを知っていただけか。多分私はそれを間違っている。 –

答えて

17
import yum 

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

ありがとうございます。私はそれが何か簡単でなければならないことを知っていた。私は正気がこれをチェックし、それはすべて良い見えます! –

1

:後でこの記事全体でつまずく人のため

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

もっと純粋なPythonのアプローチを望んでいましたが、自分の製品が既にインストールされているかどうか(つまりアップグレードのシナリオ)を判断するためにそれを行います。 'which 'アプローチは間違いなく機能しますが、これは実践的なものと同じくらい学習練習です。 編集:私はこれを正しくフォーマットすることはできませんが、これは私のやり方です devnull = open(os.devnull、 "w") ret = subprocess.call(["which"、 "myapp 「]、STDOUT = devnull、標準エラー= subprocess.STDOUT、シェル= TRUE) devnull.close() #リターンコード場合は0(成功)である "myappの "" ある" れます。それ以外の場合は1を返します(見つからない) –

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() 
関連する問題