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

标签 python pip

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

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

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

或者,更有趣的是,也许已经有一些标准的方法可以同时做所有这些事情?当 piprequirements.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

关于python - 如何检查指定版本的包是否可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58694243/

相关文章:

python - Doc2Vec - 查找测试数据中的文档相似性

python - 如何从单独的类配置Tkinter小部件?

python - 为什么 Python 的 GIL 强制执行严格的处理顺序?

python - 将 pandas'to_html' 保存为文件

python - pip3 psutil无法安装较新版本

python - 安装Python 2.7.14 : Path to pip not recognized 时出现问题

python - 类型错误 : __call__() takes from 1 to 2 positional arguments but 3 were given

python - 使用 pip 在 Macos 上安装 pycurl 失败

python - pip install 不断询问用户和密码

python - 在 Windows 上使用 pip 从 GitHub 安装时出错