如何比较Debian软件包的版本?

44

我查看了python-aptpython-debian,它们似乎没有比较软件包版本的功能。我需要自己编写代码吗?还是有现成的工具可以使用?

理想情况下,它应该像这样:

>>> v1 = apt.version("1:1.3.10-0.3")
>>> v2 = apt.version("1.3.4-1")
>>> v1 > v2
True
4个回答

76

也许是因为标题没有提到Python(尽管标签中有),当我询问同样的问题但希望得到bash答案时,谷歌将我带到了这里。这似乎是:

$ dpkg --compare-versions 11a lt 100a && echo true
true
$ dpkg --compare-versions 11a gt 100a && echo true
$ 

要安装一个版本的rubygems,这个版本至少和lenny-backports中的版本一样新,并且在lenny和squeeze安装中不会出现任何错误,请按照以下方式操作:
sudo apt-get install rubygems &&
VERSION=`dpkg-query --show --showformat '${Version}' rubygems` &&
dpkg --compare-versions $VERSION lt 1.3.4-1~bpo50+1 &&
sudo apt-get install -t lenny-backports rubygems

也许我应该单独提问如何做到这一点,希望得到一个更加简洁明了的答案。

2
关于Python在2021年的信息,这是最佳解决方案。许多Debian版本格式不受其他答案中提到的库支持。编写一个调用bash命令的Python函数就可以像魔法一样运行。return subprocess.call(['dpkg', '--compare-versions', '11a', 'gt', '100a']) == 0 - Pierre
@PierreF 在这个情境下,“最好”的定义是主观的。这段代码只能在 Debian 衍生版的 Linux 上运行。有各种不同的情境,包括 CI 流水线,您可能想比较 Debian 版本而没有 dpkg 可用。 - Philip Couling

47
你可以使用apt_pkg.version_compare
import apt_pkg
apt_pkg.init_system()

a = '1:1.3.10-0.3'
b = '1.3.4-1'
vc = apt_pkg.version_compare(a,b)
if vc > 0:
    print('version a > version b')
elif vc == 0:
    print('version a == version b')
elif vc < 0:
    print('version a < version b')        

返回

version a > version b

感谢Tshepang在评论中指出,对于更新版本:apt.VersionCompare现在是apt_pkg.version_compare

@Tshepang:确实,我的python-apt相当老了。感谢更新。 - unutbu
实际上,您的代码运行良好。开发人员足够谨慎,将其保留为某种新方法名称的别名。 - tshepang
3
另外,apt.version_compare 无法使用。请改用 apt_pkg.version_compare - tshepang
如果我使用apt_pkg.version_compare(),就会出现ValueError: _system not initialized的错误。 - Nathan Osman
@NathanOsman:我的错误。上面的代码缺少对apt_pkg.init_system()的调用。请参见http://unix.stackexchange.com/q/172311/3330。 - unutbu
显示剩余2条评论

8

python-debian也可以实现相同的功能。在使用上与python-apt几乎完全相同:

from debian import debian_support 

a = '1:1.3.10-0.3'
b = '1.3.4-1'
vc = debian_support.version_compare(a,b)
if vc > 0:
    print('version a > version b')
elif vc == 0:
    print('version a == version b')
elif vc < 0:
    print('version a < version b')

输出:

version a > version b

2
答案特别感谢,因为它不需要安装apt_pkg,有时可能会出问题。python-debian似乎具有后备模式,可以自行实现版本比较。 - Eran

3

你已经提到了 python-aptpython-debian,但现在是2022年,Python 2.7 已经停止维护了。下面是适用于基于Debian的系统的Python 3代码,假设你已经安装了 python3-debian

from debian.debian_support import Version
v1 = Version("1:1.3.10-0.3")
v2 = Version("1.3.4-1")
print(v1 > v2)

python3-debian 会自动使用更高效的版本 python3-apt,如果已经安装。但是你也可以通过从 apt 导入 Version 来显式地使用它:

from apt import Version

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接