检查软件包是否安装的 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"
- TransactionSet() 将打开 RPM 数据库
- dbMatch 不带参数将设置一个匹配迭代器来遍历整套已安装的软件包,您可以在匹配迭代器上调用 next 来获取下一个条目,header object代表一个包裹
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")
检查 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"
- TransactionSet() 将打开 RPM 数据库
- dbMatch 不带参数将设置一个匹配迭代器来遍历整套已安装的软件包,您可以在匹配迭代器上调用 next 来获取下一个条目,header object代表一个包裹
dbMatch 也可以用来查询特定的包,你需要传递一个标签的名称,以及你要查找的那个标签的值:
dbMatch('name','mysql')
我无法得到这个答案:
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")