python:如何比较带有~的版本号

0 投票
1 回答
44 浏览
提问于 2025-04-14 17:24

我正在尝试为我的应用程序在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

撰写回答