2012-06-17 15 views
6

Estoy desarrollando un script que necesita los gestores de paquetes de un sistema. Identifiqué Fedora, Gentoo y Arch Linux utilizando la función os.uname().Identificando si el sistema operativo es (abierto) SUSE en Python?

Sin embargo, los resultados (abiertos) de SUSE uname son los mismos que en otras distribuciones de Linux. Encontré los resultados uname de muchas distribuciones en Wikipedia.

¿Hay alguna manera inteligente de identificar (abrir) SUSE con Python?

+1

'cat/proc/version'? – ChristopheD

+3

esto es peligroso de usar en primer lugar. ¿Cuál es tu problema actual? ¿No puedes simplemente verificar las capacidades específicas que necesitas? – hop

+0

Necesito saber si el SO es (Open) SUSE para usar el instalador de paquetes correcto (zypper). Si es DEBIAN (Por ejemplo), usaré apt-get ... Es por eso que necesito esto ... – ant0nisk

Respuesta

6

A partir de los comentarios en la parte superior:

  • Necesito saber si el sistema operativo es (abierto) SUSE con el fin de utilizar el instalador de paquete correcto (zypper) Si es DEBIAN (Por ejemplo), usaré apt-get ...

Sugiero que resuelva directamente el problema real. En lugar de identificar el sistema operativo, identifique el administrador de paquetes disponible.

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: Aunque el código aquí muestra la detección del programa gestor de paquetes, tal vez sería mejor para detectar la principal en sí Registro paquete. Por ejemplo, en los sistemas Debian/Ubuntu que usan dpkg, , habrá un directorio /var/lib/dpkg que contiene la base de datos del paquete; ese es un signo seguro de que dpkg o apt-get son apropiados. No sé cuáles son los directorios equivalentes para SUSE, Red Hat, etc., pero si los respalda, puede averiguarlos.

apt-get ha sido portado a sistemas Red Hat, y a través de un programa llamado alien puede obtener rpm en sistemas Debian, y así sucesivamente. Detectar la base de datos del paquete en sí es la manera más infalible de descubrir qué sistema de paquete está en uso.

Si detecta el administrador de paquetes, su código funcionará automáticamente en todas las distribuciones relacionadas.Si detecta la base de datos dpkg, su código funcionará en Debian, Ubuntu, Linux Mint y en muchas otras distribuciones basadas en Debian. Si detecta la base de datos rpm, su código funcionará en Red Hat, Centos, Fedora, Mandriva y todas las demás distribuciones basadas en RPM.

+0

Gracias! ¡Eso es lo que necesitaba! – ant0nisk

+0

¡De nada! :-) – steveha

0

salida de os.uname():

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

El comando uname -a le debe dar gran parte de la misma información.

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

continuación

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

le da:

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

y usted puede escoger los campos relevantes que necesita.

Supongo que el comando uname -a proporciona un resultado algo uniforme para las distribuciones. Si no, entonces esto no funcionará.

+0

¿Por qué el voto a favor? Me complace corregir cualquier error o mejorar la respuesta, o retirarla, pero necesito saber cuál es el problema percibido * primero *. – Levon

+2

1. Suse no tiene su nombre en uname -a – unbeli

+0

@unbeli Agradezco el primer comentario (¿qué muestra SUSE para 'uname -a') ?, su segundo comentario es grosero y fuera de línea. – Levon

7

Si la distribución sigue al Linux Standard Base, puede leer la salida de lsb_release -i.

Algo como esto:

import os 

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

Sí, eso realmente podría ayudar a mi secuencia de comandos! – ant0nisk

0

Este poco de Python repetitivo imprimirá la información de su plataforma:

import platform 

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

debe hacer el trabajo.

Cuestiones relacionadas