linux 如何检测Ubuntu版本?

vfh0ocws  于 2023-11-17  发布在  Linux
关注(0)|答案(5)|浏览(95)

我目前正在编写一个Python应用程序,可以更改一些网络配置文件。该应用程序需要在Ubuntu 10.04到13.10上运行。问题是,NetworkManager在不同版本上以不同的方式损坏(尽管他们似乎最终在13.04+中修复了它),这导致与我的应用程序不兼容。
我已经找出了每个版本上的问题,并为它们开发了解决方案,我只是不确定检测用户运行的Ubuntu版本的最佳方法是什么。
到目前为止,我提出的最好的解决方案是解析lsb_release -a的输出,但这似乎是一个相当脆弱的解决方案,并且可能会在Ubuntu派生的发行版(如Mint)中失败,甚至可能在一些“官方”变体(Kubuntu,Xubuntu等)中失败。
是否有一种好方法来检测给定Linux发行版的 base 发行版和版本,以便我可以根据该版本来选择我的应用?

nwo49xxi

nwo49xxi1#

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

c9qzyr3d

c9qzyr3d2#

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

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对这篇文章的评论也强调了更具体的平台。

eit6fx6z

eit6fx6z3#

您也可以阅读:/etc/lsb-release或/etc/debian_version作为文本文件
我使用gentoo系统,对我来说:

# cat /etc/lsb-release 
DISTRIB_ID="Gentoo"

字符串

hgtggwj0

hgtggwj04#

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

字符串

zengzsys

zengzsys5#

Python v3.10+解决方案

上面的解决方案对我来说都不起作用,也不太黑客。幸运的是,标准库的platform模块作为一个名为freedesktop_os_release()的函数非常方便!你可以在官方文档中阅读更多关于它的信息:platform.freedesktop_os_release()
下面是一个简单的例子,我最近需要在Python脚本中获取Ubuntu/Debian系统的版本代码:

>>> import platform
>>> platform.freedesktop_os_release().get("VERSION_CODENAME")
# returns -> 'focal' on my Ubuntu 20.04 system

字符串
它的Bash等效代码应该是这样的:

$ source /etc/os-release
$ echo "$VERSION_CODENAME"
# returns -> focal on my Ubuntu 20.04 system

相关问题