2012-06-17 46 views
6

Zajmuję się tworzeniem skryptu, który potrzebuje menedżerów pakietów systemu. Zidentyfikowałem Fedorę, Gentoo i Arch Linuksa za pomocą funkcji os.uname().Identyfikacja Jeśli system operacyjny jest (otwarty) SUSE w języku Python?

Jednak wyniki (otwarte) SUSE uname są takie same, jak w przypadku innych dystrybucji systemu Linux. Znalazłem uname wyniki wielu dystrybucji na Wikipedia.

Czy istnieje jakiś sprytny sposób identyfikacji (otwarcia) SUSE z Pythonem?

+1

'cat/proc/version'? – ChristopheD

+3

jest to niebezpieczne w użyciu. jaki jest twój problem_właściwości? nie możesz po prostu sprawdzić, jakich konkretnych potrzeb potrzebujesz? – hop

+0

Muszę wiedzieć, czy system operacyjny jest (Open) SUSE, aby użyć właściwego instalatora pakietów (zypper). Jeśli jest DEBIAN (na przykład), użyję apt-get ... Dlatego potrzebuję tego ... – ant0nisk

Odpowiedz

6

Z uwagi na górze:

  • Muszę wiedzieć, czy system operacyjny jest (Open) SUSE tak aby wykorzystać pakiet prawidłowego instalatora (zypper). Jeśli jest DEBIAN (na przykład), użyję apt-get ...

Proponuję, abyś bezpośrednio rozwiązał rzeczywisty problem. Zamiast identyfikować system operacyjny, należy zidentyfikować dostępny menedżer pakietów.

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" 

EDYCJA: Mimo że kod tutaj pokazuje wykrywanie programu do zarządzania pakietami, może lepiej wykryć główny rejestr pakietów. Na przykład w systemach Debian/Ubuntu, które używają dpkg, , będzie przechowywany katalog /var/lib/dpkg przechowujący bazę danych pakietu; to jest pewny znak, że odpowiednie są dpkg lub. Nie wiem, jakie ekwiwalentne są katalogi dla SUSE i Red Hata i tak dalej, ale jeśli popierasz te, możesz się dowiedzieć.

apt-get został przeniesiony do systemów Red Hat, a za pośrednictwem programu o nazwie alien można uzyskać rpm na systemach Debian i tak dalej. Wykrywanie samej bazy pakietów jest najbardziej niezawodny sposób na ustalenie, który system jest używany.

Jeśli wykryjesz menedżera pakietów, twój kod będzie automatycznie działał na wszystkich powiązanych dystrybucjach.Jeśli wykryjesz bazę danych dpkg, twój kod będzie działał na Debianie, Ubuntu, Linux Mint i wielu innych dystrybucjach opartych na Debianie. Jeśli wykryjesz bazę danych rpm, Twój kod będzie działał w Red Hat, Centos, Fedorze, Mandrivie i wielu innych dystrybucjach opartych na RPM.

+0

Dzięki! Tego właśnie potrzebowałem! – ant0nisk

+0

Nie ma za co! :-) – steveha

0

Wyjście os.uname():

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

Komenda uname -a powinno dać wiele z tych samych informacji.

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

następnie

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

daje:

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

I można wybrać odpowiednie pola, które potrzebujesz.

Zakładam, że polecenie uname -a zapewnia nieco jednolite wyjście dla dystrybucji. Jeśli nie, to nie zadziała.

+0

Dlaczego spadł? Z chęcią poprawię błędy lub poprawię odpowiedź lub wycofam ją, ale muszę wiedzieć, jaki jest postrzegany problem * pierwszy *. – Levon

+2

1. Suse nie ma nazwy w uname -a – unbeli

+0

@unbeli Doceniam pierwszy komentarz (co robi ekran SUSE dla 'uname -a') ?, twój drugi komentarz jest niegrzeczny i nie jest zgodny. – Levon

7

Jeśli dystrybucja następuje po Linux Standard Base, można odczytać dane wyjściowe z lsb_release -i.

coś takiego:

import os 

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

Tak, to mogłoby naprawdę pomóc mojemu skryptowi! – ant0nisk

0

To trochę Pythona boilerplate będzie wydrukowanie informacji platformy:

import platform 

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

powinno załatwić sprawę.