4

当您导入的模块小于或大于其 __version__ 的给定值时,如何引发异常?

有很多不同的方法可以做到这一点,但我觉得现在一定有一些非常简单的方法让我望而却步。在这种情况下,版本号的格式为 xxx

4

5 回答 5

6

Python 作为 distutils 的一部分内置了这个。该模块被调用distutils.version并能够比较几种不同的版本号格式。

from distutils.version import StrictVersion

print StrictVersion('1.2.2') > StrictVersion('1.2.1')

有关比您需要的更多信息,请参阅文档:

>>> import distutils.version
>>> help(distutils.version)
于 2009-01-07T02:52:13.710 回答
2

如果您正在谈论使用 easy_install 安装的模块,这就是您所需要的

import pkg_resources
pkg_resources.require("TurboGears>=1.0.5")

如果安装的模块版本较低,这将引发错误

Traceback (most recent call last):
  File "tempplg.py", line 2, in <module>
    pkg_resources.require("TurboGears>=1.0.5")
  File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 626, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.5/site-packages/pkg_resources.py", line 528, in resolve
    raise VersionConflict(dist,req) # XXX put more info here
pkg_resources.VersionConflict: (TurboGears 1.0.4.4 (/usr/lib/python2.5/site-packages/TurboGears-1.0.4.4-py2.5.egg), Requirement.parse('TurboGears>=1.0.5'))
于 2009-01-07T03:34:59.430 回答
1

像这样?

assert tuple(map(int,module.__version__.split("."))) >= (1,2), "Module not version 1.2.x"

这很罗嗦,但效果很好。

另外,查看pip,它提供了更高级的功能。

于 2009-01-07T02:51:06.723 回答
0

您应该使用 setuptools:

它允许您锁定应用程序的依赖关系,因此即使系统上存在多个版本的 egg 或包,也只会使用正确的版本。

这是一种更好的工作方式:如果存在错误版本的依赖关系,与其失败,不如确保存在正确的版本。

Setuptools 提供了一个安装程序,它保证运行应用程序所需的一切都在安装时存在。它还为您提供了一种方法来选择您的 PC 上可能存在的许多版本的包中的哪一个是在您发出导入语句时被加载的版本。

于 2009-01-07T11:51:04.373 回答
-2

如果您知道版本字符串的确切格式,则可以进行简单的比较:

>>> "1.2.2" > "1.2.1"
True

这只有在版本的每个部分都是个位数时才有效,但是:

>>> "1.2.2" > "1.2.10" # Bug!
True
于 2009-01-07T03:24:51.680 回答