Python Module To Detect Linux Distro Version
Question
Is there an existing python module that can be used to detect which distro of Linux and which version of the distro is currently installed.
For example:
- RedHat Enterprise 5
- Fedora 11
- Suse Enterprise 11
- etc....
I can make my own module by parsing various files like /etc/redhat-release but I was wondering if a module already exists?
Cheers, Ivan
Solution
Look up the docs for the platform module: http://docs.python.org/library/platform.html
Example:
>>> platform.uname() ('Linux', 'localhost', '2.6.31.5-desktop-1mnb', '#1 SMP Fri Oct 23 00:05:22 EDT 2009', 'x86_64', 'AMD Athlon(tm) 64 X2 Dual Core Processor 3600+') >>> platform.linux_distribution() ('Mandriva Linux', '2010.0', 'Official')
OTHER TIPS
The above answer doesn't work on RHEL 5.x. The quickest way is on a redhat-like system is to read and look at the /etc/redhat-release file. This file is updated every time you run an update and the system gets upgraded by a minor release number.
$ python
>>> open('/etc/redhat-release','r').read().split(' ')[6].split('.')
['5', '5']
If you take the split parts out it will just give you string. No module like you asked, but I figured it was short and elegant enough that you may find it useful.
I've written a package called distro
(now used by pip
) which aims to replace distro.linux_distribution
. It works on many distributions which might return weird or empty tuples when using platform
.
https://github.com/nir0s/distro (distro
, on pypi)
It provides a much more elaborate API to retrieve distribution related information.
$ python
Python 2.7.12 (default, Nov 7 2016, 11:55:55)
[GCC 6.2.1 20160830] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import distro
>>> distro.linux_distribution()
(u'Antergos Linux', '', u'ARCHCODE')
By the way, platform.linux_distribution
is to be removed in Python 3.7.
Might not be the best way, but I used subprocess to execute 'uname -v' and then looked for the distro name in the output.
import subprocess
process = subprocess.Popen(['uname','-v'], stdout=subprocess.PIPE)
stdout = process.communicate()[0]
distro = format(stdout).rstrip("\n")
if 'FreeBSD' in distro:
print "It's FreeBSD"
elif 'Ubuntu' in distro:
print "It's Ubuntu"
elif 'Darwin' in distro:
print "It's a Mac"
else:
print "Unknown distro"