2012-06-17 24 views
6

Sto sviluppando uno script che richiede i gestori di pacchetti di un sistema. Ho identificato Fedora, Gentoo e Arch Linux usando la funzione os.uname().Identificazione Se il sistema operativo è (aperto) SUSE in Python?

Tuttavia, i risultati (aperti) di SUSE uname sono gli stessi di altre distribuzioni Linux. Ho trovato i risultati di molte distro su Wikipedia.

C'è un modo intelligente per identificare (aprire) SUSE con Python?

+1

'cat/proc/version'? – ChristopheD

+3

questo è pericoloso da usare in primo luogo. qual è il tuo problema _actual_? non puoi semplicemente controllare le funzionalità specifiche di cui hai bisogno? – hop

+0

Ho bisogno di sapere se il sistema operativo è (Apri) SUSE in modo da utilizzare il pacchetto di installazione corretto (zypper). Se è DEBIAN (per esempio), userò apt-get ... Ecco perché ho bisogno di questo ... – ant0nisk

risposta

6

Dai commenti in alto:

  • ho bisogno di sapere se il sistema operativo è (Open) SUSE in modo da utilizzare il programma di installazione pacchetto corretto (zypper). Se è DEBIAN (per esempio), userò apt-get ...

Suggerisco di risolvere direttamente il problema reale. Invece di identificare il sistema operativo, identificare il gestore pacchetti disponibile.

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: Anche se il codice qui mostra rilevare il programma di gestione dei pacchetti, potrebbe essere preferibile rilevare il registro principale pacchetto stesso. Ad esempio, su sistemi Debian/Ubuntu che usano dpkg, ci sarà una directory /var/lib/dpkg che contiene il database del pacchetto; questo è un segno sicuro che dpkg o apt-get sono appropriati. Non so quali siano le directory equivalenti per SUSE e Red Hat e così via, ma se stai supportando quelle che puoi scoprire.

apt-get è stato portato su sistemi Red Hat e tramite un programma chiamato alien è possibile ottenere rpm su sistemi Debian e così via. Rilevare il database del pacchetto stesso è il modo più infallibile per capire quale sistema di pacchetti è in uso.

Se si rileva il gestore pacchetti, il codice funzionerà automaticamente su tutte le distribuzioni correlate.Se si rileva il database dpkg, il codice funzionerà su Debian, Ubuntu, Linux Mint e su molte altre distribuzioni basate su Debian. Se rilevi il database rpm, il tuo codice funzionerà su Red Hat, Centos, Fedora, Mandriva e tutte le altre distro basate su RPM.

+0

Grazie! Questo è quello di cui avevo bisogno! – ant0nisk

+0

Prego! :-) – steveha

0

uscita di os.uname():

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

Il comando uname -a dovrebbe darvi gran parte delle stesse informazioni.

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

poi

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

ti dà:

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

e si può scegliere i settori pertinenti necessari.

Suppongo che il comando uname -a fornisca un output un po 'uniforme per le distribuzioni. In caso contrario, questo non funzionerà.

+0

Perché il downvote? Sono felice di correggere eventuali errori o di migliorare la risposta, o di ritirarla, ma ho bisogno di sapere qual è il problema percepito * prima *. – Levon

+2

1. Suse non ha il suo nome in uname -a – unbeli

+0

@unbeli Apprezzo il primo commento (cosa visualizza SUSE per 'uname -a') ?, il tuo secondo commento è maleducato e fuori linea. – Levon

7

Se la distribuzione segue lo Linux Standard Base, è possibile leggere l'output di lsb_release -i.

Qualcosa di simile a questo:

import os 

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

Sì, potrebbe davvero aiutare il mio Script! – ant0nisk

0

questo po 'di Python boilerplate stamperà le informazioni di piattaforma:

import platform 

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

dovrebbe fare il lavoro.