我正在编写一个通过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和谷歌,但我很惊讶我没有找到任何比较int和浮点数的好例子,或者如果用户输入浮点数,它必须将浮点数与浮点数进行比较。
我也试过没有转换然后它可以工作,但比较是错误的。
为什么python在这个语句中说无效语法:
version3 = 5.5.5
File "<stdin>", line 1
version3 = 5.5.5
^
SyntaxError: invalid syntax
但如果我尝试以下内容:
version3 = 5.5
它没有预期的问题。这里发生了什么,为什么我不能将5.5.5分配给变量,以及将可能是整数或浮点数的值与另一个浮点数进行比较的最佳方法是什么,因为将其转换为浮点数(float)不会似乎工作。
答案 0 :(得分:14)
但是“5.5.0”不是一个浮点数。为什么期望Python能够将其转换为一个?版本不是简单的十进制数字,版本的任何元素都可以大于10:例如“5.11.35”是完全有效的版本。
您需要将变量分成三个单独的整数,并单独进行比较。
答案 1 :(得分: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
>>>
编辑:与distutils.version
提供的文档相比,pydoc distutils.version
说明文档提供了更好的文档。
答案 2 :(得分: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!