2011-12-08 13 views
8

TLDR; Ho bisogno di una semplice chiamata Python data un nome di pacchetto (ad esempio 'make') per vedere se è installata; in caso contrario, installarlo (posso fare l'ultima parte).Determina se il pacchetto è stato installato con l'API Yum Python?

Problema:

Quindi ci sono alcuni esempi di codice riportati nella http://yum.baseurl.org/wiki/YumCodeSnippets, ma a parte kludging intorno all'interno ipython e indovinare ciò che ogni metodo fa, non sembra esserci alcuna documentazione reale per la API Python per yum. Apparentemente è tutta conoscenza tribale.

[modifica] A quanto pare ho scoperto solo per caso la documentazione API (dopo aver ricevuto una risposta accettabile, ovviamente). Non è collegata dalla pagina principale, ma qui è di riferimento futuro: http://yum.baseurl.org/api/yum/

Cosa devo fare:

Ho uno script di configurazione della distribuzione che si basa su altri pacchetti di sistema (marca, gcc, eccetera.). So che posso installarli in questo modo: http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction ma mi piacerebbe avere l'opzione di interrogare se sono già installati prima di farlo, quindi posso avere l'opzione aggiuntiva di fallire semplicemente se i pacchetti non sono presenti invece di forzare l'installazione. Qual è la chiamata corretta per fare questo (o meglio, qualcuno si è preso la briga di documentare correttamente l'API al di fuori degli esempi di codice?)

Non ho mai toccato Python prima di questo progetto, e mi piace davvero, ma ... alcuni documenti del modulo sono più sfuggenti dei folletti che cavalcano un unicorno.

+1

Hai provato lo snippet 'YumSearch' dalla pagina Web che hai collegato? –

+0

Sì, ma i risultati non sembravano darmi alcuna indicazione sullo stato di installazione - solo se il rpmdb sapeva o meno del pacchetto (basato sulla corrispondenza parziale del testo dei campi specificati). Forse sto sbagliando. –

risposta

17
import yum 

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

Grazie; Sapevo che doveva essere qualcosa di semplice. Ho capito bene e tutto sembra a posto! –

1

È possibile eseguire 'che' sul sottosistema per vedere se il sistema ha i binari che stai cercando:

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

Lo faccio per determinare se il mio prodotto è già installato (vale a dire, uno scenario di aggiornamento), anche se speravo in un approccio Python più "puro". L'approccio 'which' funzionerà sicuramente, ma questo è tanto un esercizio di apprendimento quanto pratico. : edit: non riesco a ottenere questo formattare correttamente, ma questo è come lo faccio devnull = open (os.devnull, "w") ret = subprocess.call ([ "che", "myapp "], stdout = devnull, stderr = subprocess.STDOUT, shell = True) devnull.close() # Il codice di ritorno è 0 (esito positivo) se" which "found" myapp "; altrimenti restituisce 1 (non trovato) –

1

Per chi si imbatte in questo post più tardi, ecco cosa mi è venuta con. Notare che "testing" e "skip_install" sono flag che analizzo dall'invocazione dello script.

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() 
Problemi correlati