我如何检查我的系统中是否安装了某个软件包(如果可以在其他操作系统中运行,那么Linux甚至更好),是否有可以执行此操作的python模块或脚本?
我找不到任何关于。
编辑:我的意思是特定于操作系统的软件包(比如可能是.deb)
答案 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的答案。