Skip to main content
 首页 » 编程设计

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

2024年08月12日33java哥

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

  • 有importlib.util.find_spec,可以检查模块是否安装。
  • 和来自 distutils.version 的 LooseVersion 来比较版本

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

或者,更有趣的是,也许已经有一些标准的方法可以同时做所有这些事情?当 pip 从 requirements.txt

读取包时,它可能正在做同样的事情

请您参考如下方法:

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

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' 

需求功能在这个相当庞大的文档中的 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)] 

要解析需求的名称,您可以使用 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')] 

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

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