Как определить версию Ubuntu?

В настоящее время я пишу приложение Python, которое меняет некоторые сетевые файлы конфигурации. Приложение должно работать на Ubuntu 10.04 до 13.10. Проблема в том, что NetworkManager по-разному разбивается на разные версии (хотя, похоже, они, наконец, исправили его в 13.04+), и это вызывает несовместимость с моим приложением.

Я выяснил проблемы в каждой версии и разработал обходные пути для них, я просто не уверен, что лучший способ определить, какая версия Ubuntu работает.

Лучшее решение, с которым я столкнулся до сих пор, состоит в том, чтобы разобрать вывод lsb_release -a, но это, по-видимому, довольно хрупкое решение и, вероятно, потерпит неудачу с распределенными Ubuntu дистрибутивами, такими как Mint и, возможно, даже с некоторыми "официальных" вариантов (Kubuntu, Xubuntu и т.д.).

Есть ли хороший способ определить базовый дистрибутив и версию для данного дистрибутива Linux, чтобы я мог основывать варианты, которые делает мое приложение для этой версии?

Ответ 1

Лучшие варианты - использовать библиотеки 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

Библиотека платформы должна быть более полезной.

Изменить: комментарий Роба на этом посту также подчеркивает более конкретную платформу .linux_distribution(), которую я хотел бы указать здесь.

Ответ 2

Одна вещь, которую вы можете сделать, чтобы упростить свой код, - это действительно знать одну вещь о том, как написано 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, но я не знаю никакой встроенной таблицы, чтобы сделать это для вас.

Ответ 3

Также вы можете прочитать: /etc/lsb-release или /etc/debian _version в виде текстового файла

Я использую систему gentoo, и для меня:

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

Ответ 4

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

Ответ 5

вы можете просто ввести python в командной строке, тогда он будет отображаться

[email protected]:/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.