2 回答
TA贡献1921条经验 获得超9个赞
您可以使用packaging模块。安装它pip install packaging然后:
from packaging import version
import pypfopt
ver = pypfopt.__version__
if version.parse(ver) < version.parse('1.2.6'):
logger.error('Version is too low. Update')
TA贡献1872条经验 获得超3个赞
pkg_resources,与 一起分发setuptools,做您需要的事情并处理package.__version__不存在的情况。
pypfopt==1.2.6以下是您在示例中需要最小版本的方式:
python -c 'import pkg_resources; pkg_resources.require("pypfopt>=1.2.6")'
我没有安装这个软件包,所以我得到:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require
needed = self.resolve(parse_requirements(requirements))
File "python3.8/site-packages/pkg_resources/__init__.py", line 770, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'pypfopt>=1.2.6' distribution was not found
and is required by the application
警告:我经常使用它,直到现在我遇到了一个问题,即相关包具有正确的版本,但其依赖项不满足,因此pkg_resources报告失败。
例如:我已经pytorch_lightning==1.0.5安装了,但我为其依赖项之一安装了新版本,但它未列为受支持。我期望以下内容能够通过,但失败了:
python -c 'import pkg_resources; pkg_resources.require("pytorch_lightning>=1.0.4")'
和:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require
needed = self.resolve(parse_requirements(requirements))
File "python3.8/site-packages/pkg_resources/__init__.py", line 775, in resolve
raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict:
(torch 1.8.0.dev20201106+cu110 (python3.8/site-packages),
Requirement.parse('torch<1.8,>=1.3'), {'pytorch-lightning'})
如果您想确保不仅所需的模块存在并且具有正确的版本,而且其依赖项也正确,那么这是正确的做法。
所以我在这里发出信号,这pkg_resources不仅仅是比较已安装软件包的版本号 - 它还检查其依赖项。这可能会也可能不会满足您的需求。
这是不检查依赖关系是否正常的版本。在其中,我们用来pkg_resources获取包的版本,并将比较委托给packagingSO 的各种答案中所描述的:
import pkg_resources
from packaging import version
pkg = "pytorch_lightning"
min_ver = "1.0.4"
got_ver = pkg_resources.get_distribution("pytorch_lightning").version
if version.parse(got_ver) < version.parse(min_ver):
raise pkg_resources.VersionConflict(f"{pkg}>={min_ver} is needed, but found {pkg}=={got_ver}")
这次,尽管依赖项不正确(在我的示例中),但版本号足够高就足够了,因此脚本可以继续使用pytorch_lightning(我验证了它与较新版本的依赖项一起工作得很好)。
添加回答
举报