1

我正在编写一个通过 rpm 包执行的脚本,并尝试将包的发布版本与命令行上提供的两个参数--fromVersion 和--toVersion 进行比较。

我以这种方式运行脚本:

python packageSearch.py --package --fromVersion 5.5.0 --toVersion 7.0.0

即使我尝试将命令行参数转换为字符串,我也会得到以下信息:

if ( float(package['version']) >= float(options.fromVersion) and package['version'] <= options.toVersion ): 

ValueError: invalid literal for float(): 7.0.21

我搜索了stackoverflow和google,但令我惊讶的是我没有找到任何将int与float进行比较的好例子,或者如果用户输入float,它必须将float与float进行比较。

我也尝试过不转换,然后它可以工作,但比较是错误的。

为什么 python 在这个语句中说无效的语法:

version3 = 5.5.5
File "<stdin>", line 1
version3 = 5.5.5
               ^
SyntaxError: invalid syntax

但如果我尝试以下操作:

version3 = 5.5

它按预期工作没有问题。这里发生了什么,为什么我不能将 5.5.5 分配给变量,以及将可能是整数或浮点数的值与另一个浮点数进行比较的最佳方法是什么,因为使用 float() 将其转换为浮点数不会似乎工作。

4

3 回答 3

14

但是“5.5.0”不是浮点数。为什么你希望 Python 能够将其转换为一个?版本不是简单的十进制数字,版本的任何元素都可以大于 10:例如“5.11.35”是一个完全有效的版本。

您需要将变量分成三个单独的整数,并分别比较它们。

于 2013-11-06T10:21:30.520 回答
9

你可以使用distutils.version

>>> from distutils.version import StrictVersion
>>> fromVersion="5.5.0"
>>> toVersion="7.0.0"
>>> if ( StrictVersion(fromVersion) < StrictVersion(toVersion) ):
...   print "From is less than to version"
... 
From is less than to version
>>> 

编辑:pydoc distutils.versiondistutils.version.

于 2013-11-06T10:24:56.067 回答
2

将版本存储在元组而不是浮点数中,它们比较好:

assert (1,2,0) < (1,3,0)
assert (0,10) < (0,10,1)
assert (0,10) < (1,0)
assert (0,9) < (0,11)

不过,我可以看到这种方法的一些可能的问题:

assert (1,2) == (1,2,0) # Boom!
于 2013-11-06T10:28:00.353 回答