需要 python 模块的最低版本

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


我当前的解决方案很混乱。必须有一个Python式的解决方案来解决这个问题。


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, 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 行来比较两个数字。


开满天机
浏览 100回答 2
2回答

郎朗坤

您可以使用packaging模块。安装它pip install packaging然后:from packaging import versionimport pypfoptver = pypfopt.__version__if version.parse(ver) < version.parse('1.2.6'):&nbsp; &nbsp; logger.error('Version is too low. Update')

守着一只汪

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):&nbsp; File "<string>", line 1, in <module>&nbsp; File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require&nbsp; &nbsp; needed = self.resolve(parse_requirements(requirements))&nbsp; File "python3.8/site-packages/pkg_resources/__init__.py", line 770, in resolve&nbsp; &nbsp; raise DistributionNotFound(req, requirers)pkg_resources.DistributionNotFound: The 'pypfopt>=1.2.6' distribution was not found&nbsp;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):&nbsp; File "<string>", line 1, in <module>&nbsp; File "python3.8/site-packages/pkg_resources/__init__.py", line 884, in require&nbsp; &nbsp; needed = self.resolve(parse_requirements(requirements))&nbsp; File "python3.8/site-packages/pkg_resources/__init__.py", line 775, in resolve&nbsp; &nbsp; raise VersionConflict(dist, req).with_context(dependent_req)pkg_resources.ContextualVersionConflict:&nbsp;(torch 1.8.0.dev20201106+cu110 (python3.8/site-packages),&nbsp;Requirement.parse('torch<1.8,>=1.3'), {'pytorch-lightning'})如果您想确保不仅所需的模块存在并且具有正确的版本,而且其依赖项也正确,那么这是正确的做法。所以我在这里发出信号,这pkg_resources不仅仅是比较已安装软件包的版本号 - 它还检查其依赖项。这可能会也可能不会满足您的需求。这是不检查依赖关系是否正常的版本。在其中,我们用来pkg_resources获取包的版本,并将比较委托给packagingSO 的各种答案中所描述的:import pkg_resourcesfrom packaging import versionpkg = "pytorch_lightning"min_ver = "1.0.4"got_ver = pkg_resources.get_distribution("pytorch_lightning").versionif version.parse(got_ver) < version.parse(min_ver):&nbsp; &nbsp; raise pkg_resources.VersionConflict(f"{pkg}>={min_ver} is needed, but found {pkg}=={got_ver}")这次,尽管依赖项不正确(在我的示例中),但版本号足够高就足够了,因此脚本可以继续使用pytorch_lightning(我验证了它与较新版本的依赖项一起工作得很好)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python