【问题标题】:Pythonic way to check if a package is installed or not检查是否安装了包的 Pythonic 方法
【发布时间】:2015-03-06 04:26:32
【问题描述】:

检查安装在 Centos/Redhat 中的软件包列表的 Pythonic 方法?

在 bash 脚本中,我会这样做:

 rpm -qa | grep -w packagename

【问题讨论】:

  • 可以在python中使用系统命令做同样的事情。
  • 这是同一个问题吗? stackoverflow.com/questions/739993/…
  • rpm 似乎有通过rpm-python 提供的python 绑定:docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/… (这是我发现的,没有使用它..)
  • 上次我尝试使用 Python RPM API 时,发现几乎没有它的文档。 (我看到@sebastian 发布的链接是一个开始。)这不是一个简单的API,逆向工程需要一些时间。它似乎被 Fedora/RH 视为内部产品。

标签: python centos redhat


【解决方案1】:
import sys
import rpm

ts = rpm.TransactionSet()
mi = ts.dbMatch( 'name', sys.argv[1] )
try :
    h = mi.next()
    print "%s-%s-%s" % (h['name'], h['version'], h['release'])
except StopIteration:
    print "Package not found"
  1. TransactionSet() 将打开 RPM 数据库
  2. 不带参数的dbMatch会设置一个匹配迭代器来遍历整个安装的包集,你可以在匹配迭代器上调用next来获取下一个条目,一个代表一个包的头对象
  3. dbMatch 也可用于查询特定的包,您需要传递一个标签的名称,以及您要查找的该标签的值:

    dbMatch('name','mysql')
    

【讨论】:

    【解决方案2】:

    你可以使用Subprocess:

    import subprocess
    child = subprocess.Popen("rpm -qa | grep -w packagename", stdout=subprocess.PIPE, shell=True)
    output = child.communicate()[0]
    print output
    

    使用os:

    import os
    os.system("rpm -qa | grep -w packagename")
    

    【讨论】:

      【解决方案3】:
      import os
      
      present=0
      notpresent=0
      f3=open('INSTALLED.log','w')
      f2=open('NOTINSTALLED.log','w')
      
      f1=open('installed_packagelist.log','w')
      
      var = os.popen("rpm -qa --queryformat '[%{NAME}\n]'").read()
      f1.write(var)
      
      
      lines = [line.rstrip('\n') for line in open('installed_packagelist.log')]
      
      for index in range(len(lines)):
       contents = lines[index]
       test_str = "rpm -V " + contents
       var = os.system(test_str)
       if (var == 0):
        print contents + "file present"
        present = present +1
        f3.write(contents)
      
       else:
        print contents + "file not present"
        notpresent = notpresent + 1
        f2.write(contents)  
      
      print present
      print notpresent
      
      f2.close()
      f3.close()
      
      f3=open('INSTALLED.log','r')
      f2=open('NOTINSTALLED.log','r')
      
      
      data=f3.read()
      print data
      
      print       "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
      
      data=f2.read()
      print data
      

      【讨论】:

      • 请阅读How to answer主题。您至少应该提供一些描述,而不仅仅是一些代码。
      【解决方案4】:

      我无法得到这个答案:https://stackoverflow.com/a/51258124/498657 在 Python 3.6.8 上工作,对我有用的是:

      import sys
      import rpm
      
      ts = rpm.TransactionSet()
      mi = ts.dbMatch( 'name', 'lsof' )
      
      rpmhit=0
      for h in mi:
          if h['name'] == 'lsof':
              rpmhit=1
              break
      
      if rpmhit == 0:
          print('Error: Package lsof not installed. Install using: dnf install lsof')
          sys.exit(3)
      

      【讨论】:

        【解决方案5】:

        为了验证 Python 3.6.12 是否安装了包“pacemaker-cli”,我使用了:

        import rpm
        
        ts = rpm.TransactionSet()
        mi = ts.dbMatch( 'name', 'pacemaker-cli' )
        
        try :
            h = mi.__next__()
            print ("%s-%s-%s.%s" % (h['name'].decode(), h['version'].decode(), h['release'].decode(), h['arch'].decode()))
        
        except StopIteration:
            print ("Package not found")
        

        【讨论】:

          猜你喜欢
          • 2013-03-23
          • 2010-11-06
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-23
          • 2017-04-13
          相关资源
          最近更新 更多