2012-06-17 6 views
6

Я разрабатываю сценарий, которому требуется менеджерам пакетов системы. Я определил Fedora, Gentoo и Arch Linux, используя функцию os.uname().Идентификация Если ОС (Open) SUSE в Python?

Однако результаты (открытые) SUSE uname аналогичны другим Linux Distros. Я нашел uname результаты многих дистрибутивов на Wikipedia.

Есть ли какой-нибудь умный способ идентифицировать (открыть) SUSE с Python?

+1

'cat/proc/version'? – ChristopheD

+3

Это опасно для использования в первую очередь. Какова ваша проблема _actual_? не можете ли вы просто проверить конкретные возможности, которые вам нужны? – hop

+0

Мне нужно знать, есть ли ОС (Открыть) SUSE, чтобы использовать правильный установщик пакетов (zypper). Если это DEBIAN (например), я буду использовать apt-get ... Вот почему мне это нужно ... – ant0nisk

ответ

6

Из комментариев в верхней части:

  • Мне нужно знать, если ОС (Open) SUSE, чтобы использовать правильный пакет установщика (Zypper). Если это DEBIAN (для примера), я буду использовать apt-get ...

Предлагаю вам решить реальную проблему. Вместо идентификации ОС определите доступный менеджер пакетов.

import os 
def file_exists(fname): 
    try: 
     os.stat(fname) 
     return True 
    except OSError: 
     return False 


if file_exists('/usr/bin/zypper'): 
    ... # do the SUSE case 
elif file_exists('/usr/bin/apt-get'): 
    ... # do the Debian/Ubuntu case 
elif file_exists('/usr/bin/yum'): 
    ... # do the Red Hat case 
else: 
    raise OSError, "cannot find a usable package manager" 

EDIT: Хотя код здесь показывает обнаружение программы менеджера пакетов, это может быть лучше, чтобы обнаружить основной пакет самого реестра. Например, в системах Debian/Ubuntu, которые используют dpkg, , будет находиться каталог /var/lib/dpkg, содержащий базу данных пакетов; это верный признак того, что подходят dpkg или apt-get. Я не знаю, что эквивалентные каталоги для SUSE и Red Hat и т. Д., Но если вы поддерживаете тех, которые вы можете узнать.

apt-get был портирован в системы Red Hat, и с помощью программы alien вы можете получить rpm в системах Debian и так далее. Обнаружение самой базы данных пакета является наиболее надежным способом выяснить, какая система пакетов используется.

Если вы обнаружите менеджера пакетов, ваш код будет автоматически работать со всеми связанными дистрибутивами.Если вы обнаружите базу данных dpkg, ваш код будет работать на Debian, Ubuntu, Linux Mint и многих других дистрибутивах на основе Debian. Если вы обнаружите базу данных rpm, ваш код будет работать на Red Hat, Centos, Fedora, Mandriva и всех других дистрибутивах на основе RPM.

+0

Спасибо! Вот что мне нужно! – ant0nisk

+0

Добро пожаловать! :-) – steveha

0

Выход os.uname():

('Linux', 
'i7', 
'2.6.32-41-generic', 
'#90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012', 
'i686') 

Команда uname -a должна дать вам большую часть той же самой информации.

% uname -a 
Linux i7 2.6.32-41-generiC#90-Ubuntu SMP Tue May 22 11:31:25 UTC 2012 i686 GNU/Linux 

затем

distr = os.popen('uname -a').read().split() 

дает вам:

['Linux', 
'i7', 
'2.6.32-41-generic', 
'#90-Ubuntu', 
'SMP', 
'Tue', 
'May', 
'22', 
'11:31:25', 
'UTC', 
'2012', 
'i686', 
'GNU/Linux'] 

И вы можете выбрать соответствующие поля нужно.

Я предполагаю, что команда uname -a обеспечивает несколько равномерный выход для распределений. Если нет, то это не сработает.

+0

Почему downvote? Я рад исправить любые ошибки или улучшить ответ, или отменить его, но мне нужно знать, что воспринимаемая проблема * первая *. – Levon

+2

1. Suse не имеет своего имени в uname -a – unbeli

+0

@unbeli. Я ценю первый комментарий (что отображает SUSE для 'uname -a')? Ваш второй комментарий груб и не соответствует. – Levon

7

Если распределение соответствует Linux Standard Base, вы можете прочитать результат lsb_release -i.

Что-то вроде этого:

import os 

try: 
    distro = os.popen('lsb_release -i').read().split(':')[1].strip() 
except IndexError: 
    distro = None 
+0

Да, это может действительно помочь моему сценарию! – ant0nisk

0

Это немного Python шаблонного напечатает вашей информации платформы:

import platform 

print platform.linux_distribution() 
('openSUSE ', '11.4', 'x86_64') 

должен делать эту работу.

 Смежные вопросы

  • Нет связанных вопросов^_^