2010-08-02 661 views
13

是否有一种优雅且更像Python的方式来检查软件包是否安装在Debian上?检查是否安装了软件包

在bash脚本,我会做:

dpkg -s packagename | grep Status 

建议做一个Python脚本一样吗?

感谢,

回答

1

看一看commands。这对于在命令行上运行并获取状态非常有用。

否则,我确定有一些库可以让你与apt进行交互。 python-apt可能工作,但它有点生。只是捕获命令行似乎更容易。

3

如果你检查它安装一个Python模块,你可以从相关的Python脚本中测试了这个包的存在 - 尝试导入它,看看你得到一个异常:

import sys 
try: 
    import maybe 
except ImportError: 
    print "Sorry, must install the maybe package to run this program." 
    sys.exit(1) 
+2

这些不是OP正在寻找的软件包。 Python软件包和Debian软件包管理器的软件包(很大程度上)是不同的。见:http://en.wikipedia.org/wiki/Dpkg – Oli 2010-08-02 17:03:06

+0

那么,OP确实询问是否有从Python脚本内部的方式,所以我不认为这是一个飞跃,认为他正在寻找用于检测Python模块依赖关系的方法。尽管如此,我希望我的答案更合适。 – PaulMcG 2010-08-02 17:16:06

+2

谷歌送我到这里寻找这个答案,所以很感激。 – noah 2014-02-07 22:57:36

1

稍微更好,你的bash例如希望惯用版本:

import os, subprocess 
devnull = open(os.devnull,"w") 
retval = subprocess.call(["dpkg","-s","coreutils"],stdout=devnull,stderr=subprocess.STDOUT) 
devnull.close() 
if retval != 0: 
    print "Package coreutils not installed." 
12

这是一个Python的方式:

import apt 
cache = apt.Cache() 
if cache['package-name'].is_installed: 
    print "YES it's installed" 
else: 
    print "NO it's NOT installed" 
+0

好答案 – jsj 2014-07-09 23:46:35

+0

在没有安装软件包的情况下,您会得到一个关键错误。还有另外一种方法可以解决这个问题,如果找不到软件包,可以提供更整洁的输出。我将把它作为OP的评论发布。 – 2017-08-14 14:38:48

0

我需要一个跨平台兼容的解决方案,所以我最终使用which

import subprocess 
retval = subprocess.call(["which", "packagename"]) 
if retval != 0: 
    print("Packagename not installed!") 

虽然它不像上述答案那样pythonic它在大多数平台上都能正常工作。

0

这是一些代码,如果软件包已安装或没有安装(在屏幕上触发乱糟糟的错误消息),它将为您提供一种简洁的显示方式。不过,这仅适用于Python 3。

import apt 
cache = apt.Cache() 
cache.open() 

response = "Package Installed." 
try: 
    cache['notapkg'].is_installed 
except KeyError: 
    response = "Package Not Installed." 

print(response)