如何检查系统中是否安装了某些软件包(如果可以在其他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发行版",所以在这里都在谈论错误。 :)