8

我目前正在编写一个更改一些网络配置文件的 Python 应用程序。该应用程序需要在 Ubuntu 10.04 到 13.10 上运行。问题是,NetworkManager 在不同版本上以不同方式被破坏(尽管他们似乎最终在 13.04+ 中修复了它),这导致与我的应用程序不兼容。

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

到目前为止,我想出的最好的解决方案是解析 的输出lsb_release -a,但这似乎是一个相当脆弱的解决方案,并且可能会在 Ubuntu 派生的发行版(如 Mint)甚至一些“官方”变体中失败(Kubuntu、Xubuntu 等)。

有没有一种好方法可以检测给定 Linux 发行版的基本发行版和版本,以便我可以基于该版本做出我的应用程序的选择?

4

4 回答 4

11

你可以做的一件事来简化你的代码是真正了解一件事是如何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 发行版都有帮助,但我不知道有任何内置表可以为你做这件事。

于 2013-10-30T21:59:58.943 回答
9

最好的选择是使用操作系统和平台库。

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() 认为我会在这里指出这一点。

于 2013-10-30T21:57:56.290 回答
1
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
于 2013-10-31T15:35:15.023 回答
1

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

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

# cat /etc/lsb-release 
DISTRIB_ID="Gentoo"
于 2013-10-31T08:16:32.693 回答