检查软件包是否安装的 Pythonic 方法

Pythonic way to check if a package is installed or not

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

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

 rpm -qa | grep -w packagename

你可以使用 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")
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
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 来获取下一个条目,header object代表一个包裹
  3. dbMatch 也可以用来查询特定的包,你需要传递一个标签的名称,以及你要查找的那个标签的值:

    dbMatch('name','mysql')
    

我无法得到这个答案: 在 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)

对于 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")