如何检查指定版本的包是否可用?

Aiv*_*ven 3 python pip

例如,函数available('foobar>=1.1')应检查软件包是否foobar已安装且其版本 >= 1.1。

  • importlib.util.find_spec,可以检查模块是否安装。
  • LooseVersionfromdistutils.version比较版本

但是我如何解析字符串foobar>=1.1并将其拆分为模块、版本和比较器?

或者,更有趣的是,也许已经有一些标准方法可以同时完成所有这些事情?pip当它读取包时可能会做同样的事情requirements.txt

Har*_*Har 5

如果有帮助,您可以执行以下操作:

import pkg_resources
my_packages = list(pkg_resources.find_distributions("C:/python27/lib/site-packages"))
version_string = my_packages[0].version

In [24]: print(my_packages[0])
zc.buildout 2.9.4
In [25]: my_packages[0]
Out[25]: '2.9.4'
Run Code Online (Sandbox Code Playgroud)

需求功能是在这个相当大的文档中的 pkg_resource 中实现的:

https://setuptools.readthedocs.io/en/latest/pkg_resources.html

例如,以下命令检查包是否可用,如果不可用则提供异常

In [31]: pkg_resources.require('zc.buildout == 2.9.4')
Out[31]:
[zc.buildout 2.9.4 (c:\python27\lib\site-packages),
 setuptools 40.6.2 (c:\python27\lib\site-packages)]
Run Code Online (Sandbox Code Playgroud)

要解析需求的名称,您可以使用 pkg_resources.parse_requirements 这将为您提供版本、模块名称和使用的比较器。

require = list(pkg_resources.parse_requirements("zc.buildout == 2.9.4"))[0]
print(require.name)
'zc.buildout'
print(require.specs)
 [('==', '2.9.4')]
Run Code Online (Sandbox Code Playgroud)

对于您想要编写的函数,您可以执行以下操作,请注意,这不会检查包是否可用。

def split_package_requirement(package_string='foobar>=1.1'):
    """Splits the requirement into, name, comparator and version."""
    requirement = next(pkg_resources.parse_requirements("zc.buildout == 2.9.4"))
    comparator, version = requirement.specs[0]

    return requirement.name, comparator, version
Run Code Online (Sandbox Code Playgroud)