python:如何比较带有~的版本号
我正在尝试为我的应用程序在Ubuntu上编写版本比较的逻辑。版本通常是这样的格式"1.2.3~18.04"(后面跟着一个~和操作系统版本)。到目前为止,我一直使用LooseVersion来比较版本。但是,由于LooseVersion在Python 3.11及以上版本中被移除了,我开始尝试使用打包模块(正如这里所建议的)。不过,打包模块的parse()方法把它当作无效版本(InvalidVersion)。我可以提取~之前的版本子字符串并进行比较,但我很好奇有没有办法在不拆分字符串的情况下实现这一点。下面是我尝试过的示例代码。请告诉我在这种情况下正确的版本比较方法是什么。
from packaging import version
from distutils.version import LooseVersion
def compare_versions(version1, version2):
if version.parse(version1) < version.parse(version2):
return f"{version1} is older than {version2}"
elif version.parse(version1) > version.parse(version2):
return f"{version1} is newer than {version2}"
else:
return f"{version1} is the same as {version2}"
def compare_versions_loose(version1, version2):
if LooseVersion(version1) < LooseVersion(version2):
return f"{version1} is older than {version2}"
elif LooseVersion(version1) > LooseVersion(version2):
return f"{version1} is newer than {version2}"
else:
return f"{version1} is the same as {version2}"
v1 = "1.2.3"
v2 = "1.2.4"
v3 = "1.2.34~18.04"
#This works as expected. output is "1.2.3 is older than 1.2.4"
result = compare_versions(v1, v2)
print(result)
#This works as expected. output is "1.2.4 is older than 1.2.34~18.04"
result = compare_versions_loose(v2, v3)
print(result)
# this throws error. packaging.version.InvalidVersion: Invalid version: '1.2.34~18.04'
result = compare_versions(v1, v3)
print(result)
1 个回答
0
试试这个:
from packaging import version
import re
def preprocess_version(version_string):
# Remove everything after and including the "~" character
return version_string.split("~")[0]
def compare_versions(version1, version2):
version1 = preprocess_version(version1)
version2 = preprocess_version(version2)
if version.parse(version1) < version.parse(version2):
return f"{version1} is older than {version2}"
elif version.parse(version1) > version.parse(version2):
return f"{version1} is newer than {version2}"
else:
return f"{version1} is the same as {version2}"
v1 = "1.2.3"
v2 = "1.2.4"
v3 = "1.2.34~18.04"
result = compare_versions(v1, v2)
print(result)
result = compare_versions(v2, v3)
print(result)
result = compare_versions(v1, v3)
print(result)
输出结果:
1.2.3 is older than 1.2.4
1.2.4 is older than 1.2.34
1.2.3 is older than 1.2.34