为了账号安全,请及时绑定邮箱和手机立即绑定

需要 python 模块的最低版本

需要 python 模块的最低版本

开满天机 2023-09-26 16:59:46
我需要确保导入的包之一至少是 v1.2.6。我在这里看到的所有问题都检查正在运行的Python版本。我想检查该模块的版本。我当前的解决方案很混乱。必须有一个Python式的解决方案来解决这个问题。import pypfoptver = pypfopt.__version__major, minor, iter = ver.split('.')major = int(major)minor = int(minor)iter  = int(iter)if major < 1:    logger.error("major version less than 1")if minor < 2:    logger.error("minor version less than 2")if iter < 6:    logger.error("iter version less than 6")可能重复:虽然关于 SO, 1 , 2 , 3也有类似的问题,但这些问题正在解决如何从 获取和打印结果module.__version__,我已经在这样做了。我的问题是,是否有一种干净的、Pythonic 的方法来检查版本号与最小版本号。例如:if pypfopt.__version__ < 1.2.6:    logger.error("Version is too low. Update")但__version__返回一个字符串,并且由于有两个小数(1.2.6),因此无法将其转换为浮点数,然后进行比较。目前,我正在将每个单独的数字转换为 int,然后进行比较。如此混乱的解决方案不可能是正确的方法。我使用 10 行来比较两个数字。
查看完整描述

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')


查看完整回答
反对 回复 2023-09-26
?
守着一只汪

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(我验证了它与较新版本的依赖项一起工作得很好)。


查看完整回答
反对 回复 2023-09-26
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信