45

I looked at python-apt and python-debian, and they don't seem to have functionality to compare package versions. Do I have to write my own, or is there something I can use?

Ideally, it would look something like:

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

4 Answers 4

77

Perhaps because the title doesn't mention Python (though the tags do), Google brought me here when asking the same question but hoping for a bash answer. That seems to be:

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

To install a version of rubygems that's at least as new as the version from lenny-backports in a way that gives no errors on lenny and squeeze installations:

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

Perhaps I should have asked how to do that in a separate question, in the hope of getting a less clunky answer.

Sign up to request clarification or add additional context in comments.

2 Comments

For info, for Python in 2021, this is the best solution. There are a lot of Debian versions format not supported by the lib mentioned in other answsers. Making a Python function that call the bash command in this answers works like a charm. return subprocess.call(['dpkg', '--compare-versions', '11a', 'gt', '100a']) == 0
@PierreF "best" is subjective in this context. This code will only run on a debian fork version of linux. There's various contexts, including CI pipelines where you may want to compare Debian versions and not have dpkg available.
47

You could use 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')        

yields

version a > version b

Thanks to Tshepang for noting in the comments that for newer versions: apt.VersionCompare is now apt_pkg.version_compare.

7 Comments

I guess your packager installed it in a different place. I found it here. And that's about the same place I fin mine also. I also think you have an old version of python-apt because they are moving away from CamelCase, and I guess that's why it isn't documented.
@Tshepang: Indeed, my python-apt is pretty old. Thanks for the update
Actually, your code works fine. The developers were prudent enough to keep it as some sort of alias for newer method names.
Also, apt.version_compare doesn't work. Use apt_pkg.version_compare instead.
I end up with ValueError: _system not initialized if I use apt_pkg.version_compare().
|
8

python-debian can do this too. It's used in an almost identical way to 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')

ouput:

version a > version b

1 Comment

Answer appreciated especially because it doesn't require installing apt_pkg which can be problematic sometimes. python-debian seems to have a fallback mode that implements the version comparison by itself.
4

As you already mentioned python-apt and python-debian, but it is 2022 by now and Python 2.7 is end-of-life, here's the Python 3 code for a Debian based system, where you have installed 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 will automatically used the more efficient version from python3-apt if it is installed. But you also can use it explicitly by importing Version from apt:

from apt import Version

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.