我如何检测Ubuntu版本?

我目前正在编写一个改变一些networkingconfiguration文件的Python应用程序。 该应用程序需要在Ubuntu 10.04至13.10上运行。 问题是,NetworkManager在不同的版本中有不同的方式(尽pipe它们最终在13.04+版本中修复了这个问题)被破坏了,这会导致与我的应用程序不兼容。

我已经找出了每个版本的问题,并为他们开发了解决方法,我只是不确定最好的方法是检测用户正在运行的Ubuntu版本。

到目前为止我所提出的最好的解决scheme是parsinglsb_release -a的输出,但是这似乎是一个相当脆弱的解决scheme,可能会失败,例如Mint等Ubuntu派生的发行版本,甚至可能会出现一些“官方“变体(Kubuntu,Xubuntu等)。

有没有一种很好的方法来检测给定的Linux发行版的基本分布和版本,所以我可以基于我的应用程序在该版本上做出的select?

Solutions Collecting From Web of "我如何检测Ubuntu版本?"

最好的选择是使用os和平台库。

 import os import platform print os.name #returns os name in simple form platform.system() #returns the base system, in your case Linux platform.release() #returns release version 

平台库应该是更有用的一个。

编辑:罗布的这篇文章的评论也突出了更具体的platform.linux_distribution()以为我会指出这里。

为了简化代码,你可以做的一件事情是实际知道一件事情,就是如何写lsb_release。 它实际上是用python编写的。

所以我们可以减少大部分的代码

 >>> import lsb_release >>> lsb_release.get_lsb_information() {'RELEASE': '10.04', 'CODENAME': 'lucid', 'ID': 'Ubuntu', 'DESCRIPTION': 'Ubuntu 10.04.4 LTS'} 

这不一定会帮助所有的sub-ubuntu发行版,但我不知道任何内置的表为你做。

你也可以阅读: / etc / lsb-release或/ etc / debian_version文本文件

我使用gentoo系统,对我来说:

 # cat /etc/lsb-release DISTRIB_ID="Gentoo" 
 def getOsFullDesc(): name = '' if isfile('/etc/lsb-release'): lines = open('/etc/lsb-release').read().split('\n') for line in lines: if line.startswith('DISTRIB_DESCRIPTION='): name = line.split('=')[1] if name[0]=='"' and name[-1]=='"': return name[1:-1] if isfile('/suse/etc/SuSE-release'): return open('/suse/etc/SuSE-release').read().split('\n')[0] try: import platform return ' '.join(platform.dist()).strip().title() #return platform.platform().replace('-', ' ') except ImportError: pass if os.name=='posix': osType = os.getenv('OSTYPE') if osType!='': return osType ## sys.platform == 'linux2' return os.name 

你可以在命令行中输入python,然后显示出来

 root@JINGWEI:/mnt/f/make-ipinyou-data# python Python 2.7.6 (default, Jun 22 2015, 17:58:13) [GCC 4.8.2] on linux2 Type "help", "copyright", "credits" or "license" for more information.