2011-12-08 39 views
8

TLDR;我需要一个简单的Python调用给定一个包名(例如'make')来查看它是否已经安装;如果没有,安装它(我可以做后者)。确定是否安装了Yum Python API包?

问题:

因此,有在http://yum.baseurl.org/wiki/YumCodeSnippets给出了几个代码示例,但比内IPython的周围kludging在什么每个方法的猜测等,似乎没有要为任何实际的文件yum的Python API。这显然是所有的部落知识。

[编辑]显然我只是偶然发现了API文档(接收当然可接受的答案,之后)。这不是从主网页链接,但在这里它是供将来参考:http://yum.baseurl.org/api/yum/

我需要做什么:

我有依赖于其他系统软件包部署配置脚本(做,GCC,等等。)。我知道我可以像这样安装它们:http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction但我希望可以选择查询它们是否已经安装,因此如果软件包不存在,我可以选择简单失败,而不是强制安装。什么是正确的电话做这个(或更好的,有人真的很困扰,以正确的文件API代码示例以外?)

我从来没有碰过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方法。 “哪一种”方法肯定会奏效,但这是一个学习练习,因为它是一个实用的练习。 :编辑:我不能得到这个正确的格式,但是这是我要做的事 devnull =开放(os.devnull, “W”) RET = subprocess.call([ “这”,“MYAPP “),stdout = devnull,stderr = subprocess.STDOUT,shell = True) devnull.close() #如果”which“找到”myapp“,返回码为0(成功)。否则返回1(未找到) –

1

对于任何人谁碰到这个帖子后失蹄,这里就是我想出了用。请注意,“测试”和“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()