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

Was it helpful?

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"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top