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