Get Linux Distribution Name and Version with Python

Since Debian 10 Buster there is no minor version number in lsb_release output or /etc/os-release anymore. Bug has been filed, but apparently there is no will to get the full version number back.

The dist() and linux_distribution() functions in the platform module in Python have been deprecated in 3.5 and removed in 3.8.0:

$ python3
Python 3.7.3 (default, Apr  3 2019, 05:39:12)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import platform
>>> platform.dist()
__main__:1: DeprecationWarning: dist() and linux_distribution() functions are deprecated in Python 3.5
('debian', '10.1', '')
>>>

Also, the distro package in PyPI didn’t provide the correct output as I tested it briefly.

Hence, here is my own get_distro.py for getting the inventory data correct with our Linux servers:

import csv

RELEASE_DATA = {}

with open("/etc/os-release") as f:
    reader = csv.reader(f, delimiter="=")
    for row in reader:
        if row:
            RELEASE_DATA[row[0]] = row[1]

if RELEASE_DATA["ID"] in ["debian", "raspbian"]:
    with open("/etc/debian_version") as f:
        DEBIAN_VERSION = f.readline().strip()
    major_version = DEBIAN_VERSION.split(".")[0]
    version_split = RELEASE_DATA["VERSION"].split(" ", maxsplit=1)
    if version_split[0] == major_version:
        # Just major version shown, replace it with the full version
        RELEASE_DATA["VERSION"] = " ".join([DEBIAN_VERSION] + version_split[1:])

print("{} {}".format(RELEASE_DATA["NAME"], RELEASE_DATA["VERSION"]))

Example outputs:

On Ubuntu 18.04.3:

$ lsb_release -ds
Ubuntu 18.04.3 LTS
$ python3 get_distro.py
Ubuntu 18.04.3 LTS (Bionic Beaver)

On Debian 9.11 Stretch:

$ lsb_release -ds
Debian GNU/Linux 9.11 (stretch)
$ python3 get_distro.py
Debian GNU/Linux 9.11 (stretch)

On Debian 10.1 Buster:

$ lsb_release -ds
Debian GNU/Linux 10 (buster)
$ python3 get_distro.py
Debian GNU/Linux 10.1 (buster)

Feel free to comment below with other Linux distribution outputs.

Update: On CentOS 8 (I believe some tuning would be useful):

$ lsb_release -ds
"CentOS Linux release 8.0.1905 (Core) "
$ python3 get_distro.py
CentOS Linux 8 (Core)
$ cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

Leave a Reply