2011-12-08 19 views
8

TLDR; Yüklü olup olmadığını görmek için paket adı verilen basit bir Python çağrısına (örneğin, 'make') ihtiyacım var; eğer değilse, kurun (ikinci kısmı yapabilirim).Yum Python API ile yüklü paket olup olmadığını belirleme?

Sorun:

Bu yüzden birkaç kod http://yum.baseurl.org/wiki/YumCodeSnippets verilen örnekler, ancak ipython içinde etrafında kludging ve her yöntemi ne de tahmin dışında herhangi fiili dokümantasyon olacaksa görünmüyor vardır Yum için Python API. Görünüşe göre tüm kabile bilgisi.

[değiştir]

Anlaşılan sadece yanlışlıkla (tabii kabul edilebilir bir cevap aldıktan sonra) API belgelerini keşfetti. ,

Ben diğer sistem paketleri dayanan bir dağıtım yapılandırma komut dosyası var (yapmak, gcc: Ana sayfadan bağlantı, ama burada ileride yararlanmak üzere olduğu değil: http://yum.baseurl.org/api/yum/

Yapmam gerekenler vb.). Bunları şu şekilde yükleyebileceğimi biliyorum: http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction Ancak, bunu önceden yüklemişlerse sorgulama seçeneğine sahip olmak istiyorum, bu yüzden paketlerin mevcut olmaması durumunda başarısız olmanın ek seçeneğine sahip olabilirim. zorlama yükleme. Bunu yapmak için doğru çağrı nedir (ya da daha iyisi, API örnek kodları dışında düzgün bir şekilde belgelemek için gerçekten rahatsız olan var mı?)

Bu projeden önce Python'a hiç dokunmadım ve gerçekten çok beğeniyorum ama ... modül belgelerinin bir kısmı tek boynuzlu atlı cüce cinlerden daha zor.

+1

Bağladığınız web sayfasından 'YumSearch' snippet'ini denediniz mi? –

+0

Evet, ancak sonuçları bana yüklü durumla ilgili herhangi bir gösterge vermedi - rpmdb paket hakkında (belirtilen alanların kısmi metin eşlemesine dayanarak) biliniyor olsun ya da olmasın. Belki yanlış yapıyorum. –

cevap

17
import yum 

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

döndürür Teşekkür ederim; Basit bir şey olması gerektiğini biliyordum. Aklımı bu kontrol ettim ve her şey güzel görünüyor! –

1
Sistem Aradığınız ikilileri varsa alt sistemi üzerinde görmek için 'hangi' çalıştırabilir

: Ben ne çıktı daha sonra bu yazı rastlar herkes için

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

Ürünümün yüklü olup olmadığını (yani bir yükseltme senaryosu) belirlemek için bunu yapıyorum, ancak daha "saf" bir Python yaklaşımı umuyordum. 'Hangi' yaklaşım kesinlikle işe yarayacak, ama bu pratik bir uygulama olduğu kadar bir öğrenme alıştırması. : düzenleme: Ben bu düzgün biçimlendirmek alamayan, ama bu devnull = (os.devnull, "w") ret = subprocess.call ([açık "olan", "myapp böyle yaparız "], stdout = devnull, stderr = altprocess.STDOUT, kabuk = True) devnull.close() #" Dönüş kodu 0 "(başarı)" bulundu "" myapp "; aksi halde 1 (bulunamadı) –

1

, burada ile. "Sınama" ve "skip_install" ifadelerinin, betiğin çağrılmasından ayrıştırdığım işaretler olduğunu unutmayın.

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() 
İlgili konular