【问题标题】:Require a minimum version of a python module需要最低版本的 python 模块
【发布时间】:2021-01-17 17:15:10
【问题描述】:

我需要确保其中一个导入的包至少是 v1.2.6。我在这里看到的所有问题都检查了 Python 运行的版本。我想检查模块的版本。

我目前的解决方案很混乱。必须有一个pythonic解决方案。

import pypfopt
ver = 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、123 上存在类似问题,但这些问题正在解决如何从 module.__version__ 获取和打印结果,我已经在这样做了。

我的问题是,是否有一种干净的、pythonic 的方式来检查该版本号与最低版本号。例如:

if pypfopt.__version__ < 1.2.6:
    logger.error("Version is too low. Update")

但是__version__ 返回一个字符串,并且由于有两位小数(1.2.6)它不能转换为浮点数,然后进行比较。目前,我正在将每个单独的数字转换为 int,然后进行比较。

  • 没有办法解决这么混乱的问题。
  • 我使用 10 行来比较两个数字。

【问题讨论】:

  • 我相信这种事情通常会在安装时处理。你是如何分发模块的?
  • 通常我会。我们的大多数机器上都运行了旧版本,我想确保在它们中的任何一个开始运行脚本之前,它们已经更新到最新版本,因为我们需要 1.2.6 中的错误修复
  • 这能回答你的问题吗? How to check version of python modules?
  • @AMC,不完全是。我能够获得版本“1.2.6”的字符串,但将每个部分转换为 int,然后根据最低版本检查它似乎很复杂。似乎有一种我不知道的pythonic方式。
  • 我想这就是你要找的东西:stackoverflow.com/questions/11887762/…

标签: python


【解决方案1】:

您可以使用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')

【讨论】:

    【解决方案2】:

    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 来获取包的版本,并将比较委托给packaging,如SO 上的各种答案中所述:

    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(我验证它可以正常使用它的较新版本依赖项)。

    【讨论】:

      猜你喜欢
      • 2018-01-28
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多