2011-12-08 12 views
8

TLDR; Necesito una llamada de Python simple dado el nombre de un paquete (por ejemplo, 'make') para ver si está instalado; si no, instálalo (puedo hacer la última parte).Determinar si el paquete está instalado con la API de Yum Python?

Problema:

Así que hay algunos ejemplos de código que figuran en http://yum.baseurl.org/wiki/YumCodeSnippets, pero aparte de kludging por el interior ipython y adivinar lo que cada método, no parece haber ninguna documentación real para el API de Python para yum. Aparentemente es todo conocimiento tribal.

[editar] Al parecer acabo accidentalmente descubrieron la documentación API (después de recibir una respuesta aceptable, por supuesto). No está enlazada desde la página principal, pero aquí es para referencia futura: http://yum.baseurl.org/api/yum/

Lo que tengo que hacer:

Tengo un script de configuración de implementación que se basa en otros paquetes del sistema (marca, gcc, etc.). Sé que puedo instalarlos así: http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction pero me gustaría tener la opción de consultar si ya están instalados antes de hacerlo, así que puedo tener la opción adicional de simplemente fallar si los paquetes no están presentes en lugar de forzando la instalación. ¿Cuál es la llamada correcta para hacer esto (o mejor, alguien realmente se molestó en documentar adecuadamente la API fuera de las muestras de código?)

Nunca he tocado Python antes de este proyecto, y realmente me gusta, pero ... parte de la documentación del módulo es más esquiva que los duendes que montan unicornios.

+1

¿Has probado el fragmento 'YumSearch' de la página web que has vinculado? –

+0

Sí, pero los resultados no parecen darme ninguna indicación del estado de instalación, solo si el rpmdb conocía o no el paquete (basado en la coincidencia de texto parcial de los campos especificados). Tal vez lo estoy haciendo mal. –

Respuesta

17
import yum 

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

Gracias; Sabía que tenía que ser algo simple. ¡Comprobé esto y todo se ve bien! –

1

Usted podría funcionar 'que' en el subsistema para ver si el sistema tiene los binarios que usted está buscando:

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

Lo hago para determinar si mi producto ya está instalado (es decir, un escenario de actualización), aunque esperaba un enfoque de Python más "puro". El enfoque 'which' definitivamente funcionará, pero esto es tanto un ejercicio de aprendizaje como práctico. : editar: No puedo obtener esto para formatear correctamente, pero así es como lo hago devnull = abrir (os.devnull, "w") ret = subprocess.call (["which", "myapp "], stdout = devnull, stderr = subprocess.STDOUT, shell = True) devnull.close() # El código de retorno es 0 (correcto) si" which "encontró" myapp "; de lo contrario, devuelve 1 (no encontrado) –

1

Para cualquier persona que se topa con este post más adelante, esto es lo que ocurrió con. Tenga en cuenta que "testing" y "skip_install" son indicadores que analizo de la invocación del 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() 
Cuestiones relacionadas