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

如何检查系统中是否安装了某些软件包(如果可以在其他OS中使用,甚至可以在Linux上安装更好的软件包),是否有任何python模块或脚本可以做到?

我找不到任何有关。

编辑:我的意思是特定于操作系统的程序包(如.deb)

检查程序是否存在于python脚本中的可能重复项

看看python apt包/模块

当您说" package"时,是指打包的Python模块,还是特定于操作系统的软件包(例如* .rpm或* .deb)?

@LukasGraf:我认为他既不是Python包,也不是Python包(就像在__init__.py和一些子模块或子包的目录中那样)。

当然,还有一个可能的含义是包的pkgconfig概念,这是使它成为某种特定于Linux的特定问题而不是特定于发行版的问题才有意义的唯一事情……但我愿意打赌那 不是他在问什么。

@LukasGraf,我的意思是特定于操作系统的软件包,很抱歉,如果我的问题根本不清楚

它不仅不清楚,而且完全具有误导性。 .deb中的"模块"是什么?

要确定是否已安装.deb,.rpm等软件包,您需要为包装系统使用适当的工具。

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

RPM有大量的Python工具-实际上,Redhat的大多数安装程序生态系统都是基于Python构建的,因此您应该已经安装了rpm模块。在寻找高级包装之前,请阅读使用Python编程RPM(或者更好的是,搜索较新的版本……),以便您了解实际的操作。即使使用低级接口,也只有几行代码。

据我所知,没有人将它们包装在通用工具中,可用于任何Linux发行版曾经使用过的每种包装格式和数据库(即使它们使用过,这在没有使用Linux的Linux系统上也不会带来什么好处)请使用包装系统)。但是,如果您只想处理少数几种流行的系统,则可以使用python-apt和Redhat自己的工具或在PyPI中搜索RPM,这几乎涵盖了您所关心的所有内容。

另外,pkg-config与"系统上安装的软件包"的通用概念最接近。每个linux系统都将拥有它(以及大多数其他非Windows系统),但不是每个软件包都向pkg-config注册。不过,如果这是您要查找的内容,pkgconfig是Python的答案。

"程序包"一词有六种相似但不兼容的含义,但是您说"程序包或模块"这一事实意味着您特别想了解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软件包安装到站点软件包中。

要检查Python模块的可用性,应使用pkg_resources.get_distribution(foo)和捕获DistributionNotFound-捕获ImportError可能会隐藏循环依赖项。

@LukasGraf:import也可能有其他问题,但是为了进行快速,肮脏的检查,它会告诉您是否可以导入模块(简单的测试脚本不会具有循环依赖性,当然,除非模块本身可以,在这种情况下,您将无法导入它,因此这是正确的答案)。 pkg_resources是setuptools的一部分,是我已经提到的那些"更奇特的东西"之一,但是也许我应该在答案中进行扩展。

我同意,它是一个更高级的细节-因此仍然为+1 ;-)但这是正确的API,它确实回答了OP提出的确切问题:是否安装了模块XY?如果可用,则是一个截然不同的问题,并且可能要让该错误浮出水面。

@LukasGraf:好吧,它是setuptools安装的软件包的正确API;对于以任何其他方式(distribute或本机3.4+ pip除外)安装的软件包,它都是一种hacker-of-of-official-of-official-of-official-of-thoughly-reliable-reliables-可靠的API。但是,更重要的是,其distutils软件包的API,而不是模块和软件包的API。除非distutils程序包仅包含一个与自身名称相同的模块或程序包,否则您将得到错误的答案。

是的,我的措辞" Python模块的可用性"是不正确的-我应该说"基于setuptools的发行版"。因此,如果您对ImageOps模块感兴趣,显然您需要检查PIL发行版(或Pillow)。

@LukasGraf:当然,事实证明,他所说的"模块和包"既不是" Python模块和包",也不是" distutils / PyPA发行版",所以在这里都在谈论错误。 :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值