我目前正在编写一个更改某些网络配置文件的Python应用程序。该应用程序需要在Ubuntu 10.04到13.10上运行。问题是,NetworkManager在不同的版本上以不同的方式被破坏(尽管它们似乎最终在13.04+中修复了它),这导致我的应用程序不兼容。
我已经找出每个版本的问题并为它们开发了解决方法,我只是不确定最好的方法是检测用户正在运行的Ubuntu版本。
我到目前为止提出的最佳解决方案是解析lsb_release -a
的输出,但这似乎是一个相当脆弱的解决方案,并且可能会失败,因为Ubuntu派生的发行版如Mint甚至可能与一些“官方”变体(Kubuntu,Xubuntu等)。
是否有一种很好的方法来检测给定Linux发行版的 base 发行版和版本,以便我可以根据我的应用程序在该版本上做出的选择?
答案 0 :(得分:8)
您可以做的一件事就是简化您的代码,实际上是知道如何编写lsb_release。它实际上是用python编写的。
所以我们可以将大部分代码减少到这个:
>>> import lsb_release
>>> lsb_release.get_lsb_information()
{'RELEASE': '10.04', 'CODENAME': 'lucid', 'ID': 'Ubuntu', 'DESCRIPTION': 'Ubuntu 10.04.4 LTS'}
这不一定对所有子ubuntu发行版有帮助,但我不知道有任何内置表可以帮助你。
答案 1 :(得分:7)
最好的选择是使用操作系统和平台库。
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
平台库应该更有用。
编辑:Rob对这篇文章的评论也突出了更具体的platform.linux_distribution(),我想我会指出这一点。
答案 2 :(得分:1)
您还可以阅读: / etc / lsb-release 或/ etc / debian_version作为文本文件
我使用gentoo系统,对我来说:
# cat /etc/lsb-release
DISTRIB_ID="Gentoo"
答案 3 :(得分:0)
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