用python检查我的系统(linux)中是否安装了一个软件包?

时间:2014-07-24 17:58:09

标签: python linux package

我如何检查我的系统中是否安装了某个软件包(如果可以在其他操作系统中运行,那么Linux甚至更好),是否有可以执行此操作的python模块或脚本?

我找不到任何关于。

编辑:我的意思是特定于操作系统的软件包(比如可能是.deb)

2 个答案:

答案 0 :(得分:3)

" package"有六个相似但不相容的含义,但事实上你说"包装或模块"暗示您特别想了解Python包和模块,就像您可以import

那样

在这种情况下,测试它的方法是import

手动,执行此操作:

$ python
>>> import foo
ImportError: No module named foo

嗯,foo尚未安装。

编程:

try:
    import foo
except ImportError:
    # do whatever you wanted if foo is missing

请注意,这实际上并没有告诉您foo丢失,只是因为它无法导入。在一个简单的测试中,你是否有这个"脚本,这通常是您想要实际检查的内容。但是,如果你真的想要检查"安装(即使坏了)"?

在最近的Python(我认为3.4+)中,ImportError会在其中包含您可以访问的其他信息 - name代表您尝试导入的名称,path它被发现等等。然而,这是EAFP可能不会比LBYL更好的情况之一。您可以使用importlib搜索模块而不尝试导入模块,如下所示:

spec = importlib.util.find_spec('foo')

如果您使用较旧的Python怎么办?有类似的功能可以追溯到3.2,但不是很好,如果你使用2.7,那真的没什么值得使用的,因为进口机器没有很好地暴露。

对于那种情况(以及与软件包安装相关的许多其他很酷的东西),使用setuptools - 这不是stdlib中的,但是大量的第三方软件包依赖于它(直到最近它才是Python软件包安装的基石,即使是非正式的):

pkg_resources.get_distribution('foo')

但是,它会查找distutils / setuptools / PyPI包,而不是Python模块或包。那里有很多重叠,但它们并不完全相同。举一个简单的例子,当您pip install more-itertools时,您将获得more-itertools PyPI包,它将more_itertools Python包安装到您的站点包中。

答案 1 :(得分:3)

要了解您是否已安装.deb,.rpm等软件包,您需要使用适合您的包装系统的工具。

APT在Debian中有一个名为python-apt的Python包装器,或者在PyPI上只有apt

RPM拥有大量的Python工具 - 实际上,Redhat的大多数安装程序生态系统都是基于Python构建的,您应该已经安装了rpm模块。在查找高级包装器之前,请先阅读Programming RPM with Python(或者,更好的是,搜索更新的版本......),这样您就可以了解自己的实际操作;即使使用低级接口,它也只有几行代码。

据我所知,没有人将这些包装在一个通用工具中,用于任何Linux发行版曾经使用的每种打包格式和数据库(并且,即使它们有,也不会对你有很大帮助)没有使用包装系统的linux系统)。但是,如果你只是想处理一些流行的系统,python-apt和Redhat自己的工具或者搜索PyPI for RPM,这几乎涵盖了你关心的所有内容。

或者,pkg-config与安装在此系统上的"软件包的通用概念最接近"。每个linux系统都会拥有它(以及大多数其他非Windows系统),但不是每个包都注册pkg-config。尽管如此,如果这是你正在寻找的,pkgconfig是Python的答案。