例如,函数available('foobar>=1.1')
应检查软件包是否foobar
已安装且其版本 >= 1.1。
importlib.util.find_spec
,可以检查模块是否安装。LooseVersion
fromdistutils.version
比较版本但是我如何解析字符串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'
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)
归档时间: |
|
查看次数: |
762 次 |
最近记录: |