TLDR ;我需要简单的Python调用给定包名称(例如,' make')以查看它是否已安装;如果没有,安装它(我可以做后一部分)。
问题:
所以在http://yum.baseurl.org/wiki/YumCodeSnippets中给出了一些代码示例,但除了在ipython内部克服并猜测每个方法的作用之外,似乎没有任何用于Python API的实际文档。百胜。它显然都是部落知识。
[edit] 显然我只是偶然发现了 API文档(当然,在收到可接受的答案后)。它没有从主页面链接,但此处是供将来参考:http://yum.baseurl.org/api/yum/
我需要做什么:
我有一个部署配置脚本,它依赖于其他系统包(make,gcc等)。我知道我可以像这样安装它们:http://yum.baseurl.org/wiki/YumCodeSnippet/SimplestTransaction但是我希望在这样做之前可以选择查询它们是否已经安装,所以我可以选择其他选项包裹不存在而不是强制安装。要做到这一点的正确要求是什么(或者更好,有没有人真正打扰在代码示例之外正确记录API?)
我在这个项目之前从未接触过Python,我真的很喜欢它,但是......有些模块文档比独角兽骑行的妖精更难以捉摸。
答案 0 :(得分:17)
import yum
yb = yum.YumBase()
if yb.rpmdb.searchNevra(name='make'):
print "installed"
else:
print "not installed"
答案 1 :(得分:1)
您可以在子系统上运行'which'来查看系统是否包含您要查找的二进制文件:
import os
os.system("which gcc")
os.system("which obscurepackagenotgoingtobefound")
答案 2 :(得分:1)
对于任何偶然发现这篇文章的人来说,这就是我想出的。请注意,“testing”和“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()
答案 3 :(得分:0)
import yum
yb = yum.YumBase()
yb.isPackageInstalled('make')