2010-05-03 12 views
22

Tengo que obtener el nombre de la distribución de Linux desde un script de Python. Hay un método dist en el módulo de plataforma:Verificar el nombre de distribución de Linux

import platform 
platform.dist() 

Pero bajo mi Arch Linux que devuelve:

>>> platform.dist() 
('', '', '') 

¿Por qué? ¿Cómo puedo obtener el nombre?

PS. Debo verificar si la distribución está basada en Debian.


Actualización: He encontrado aquí Python site, que dist() está en desuso desde 2.6.

>>> platform.linux_distribution() 
('', '', '') 
+0

@Kimvais Me refiero a obtener el nombre exactamente del script de python sin analizar ningún archivo, solo métodos estándar. – Ockonal

+0

¿Qué devuelve 'uname -a' en Arch? platform.py tiene 1600 líneas de prueba de todo lo que se pueda imaginar para distinguir varios sistemas; es una gran pila de heurística. Arch también parece estar basado solo en sí mismo, no en otra distro: http://en.wikipedia.org/wiki/Arch_Linux – msw

+0

¿Qué devuelve 'lsb_release -is' bajo Arch? Si 'platform.dist()' no le proporciona datos utilizables, puede llamar a 'subprocess.check_output ([" lsb_release "," - is "])' en su lugar. – panzi

Respuesta

9

Esto funciona para mí en Ubuntu:

('Ubuntu', '10.04', 'lucid') 

Luego utiliza strace para averiguar qué es exactamente el módulo de plataforma está haciendo para encontrar la distribución, y es esta parte:

open("/etc/lsb-release", O_RDONLY|O_LARGEFILE) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=102, ...}) = 0 
fstat64(3, {st_mode=S_IFREG|0644, st_size=102, ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb76b1000 
read(3, "DISTRIB_ID=Ubuntu\nDISTRIB_RELEAS"..., 8192) = 102 
read(3, "", 4096)      = 0 
read(3, "", 8192)      = 0 
close(3)        = 0 

Entonces, hay /etc/lsb-release que contiene esta información, que proviene del paquete de archivos base Debian de Ubuntu.

+0

Tenga en cuenta que a veces el archivo es '/ etc/os-release'. – panzi

12

Here 's lo que encontré:

platform.linux_distribution 

intenta determinar el nombre del nombre de la distribución sistema operativo Linux.

Dice platform.dist está obsoleta desde 2.6, usted tiene que utilizar platform.linux_distribution en Python 2 (pero también está en desuso en Python 3.5).

0

Dos opciones para usted:

  1. Uso plataforma de importación platform.linux_distribution() # Algo así como ('Ubuntu', '9.10', 'karma')

  2. O podría simplemente leer el contenido de/etc/debian_version ("squeeze/sid") o/etc/lsb-release que darían:

    DISTRIB_ID=Ubunt 
    DISTRIB_RELEASE=9.10 
    DISTRIB_CODENAME=karmic 
    DISTRIB_DESCRIPTION="Ubuntu 9.10" 
    
+0

Desafortunadamente, la primera opción no funciona en Arch Linux. No tengo acceso a Arch en este momento, así que no puedo probar la segunda opción. –

4

Funciona aquí. Y no, Arch Linux no está basado en Debian.

>>> import platform 
>>> platform.dist() 
('SuSE', '11.2', 'x86_64') 

Así Python no sabe cómo obtener la información de la versión de Linux del arco, y se ha hardcoded buscando/etc/redhat-release y/etc/SuSE-release.

platform.dist() es una función obsoleta. Deberías usar la plataforma.linux_distribution()

En realidad, en mi sistema que produce un resultado diferente:

>>> platform.linux_distribution() 
('openSUSE ', '11.2', 'x86_64') 

platform.linux_distribution() busca en/etc archivos que contienen "liberación" o "versión" como cadena. También se ve en el archivo de lanzamiento LSB estándar. Si al final eso no funciona, recurre a una función _dist_try_harder que intenta obtener la información de otros lugares.

Depende de Arch Linux proporcionar una información de versión de LSB estándar o parchear Python para usar su "camino".

-1

Es probable que tenga que recurrir a:

if platform.linux_distribution() == ('', '', ''): 
    # do something specific to look for Arch 

o siempre se puede aumentar lib/python2.6/platform.py y enviar los cambios.

+1

Este tipo de comparación es peligroso porque Arch Linux no es la única distribución que 'platform' no puede detectar. Amazon Linux también da como resultado una tupla vacía. –

1

Esto funcionó para mí bajo Ubuntu y Manjaro:

def get_distro(): 
    """ 
    Name of your Linux distro (in lowercase). 
    """ 
    with open("/etc/issue") as f: 
     return f.read().lower().split()[0] 
+0

Esto funciona bajo Arch Linux;) – nachopro

+1

no es una buena idea, '/ etc/issue' es para mostrar la línea de bienvenida en la consola estándar y muy a menudo es modificado por usuario/administrador. La forma estándar para detectar la distribución moderna es analizar '/ etc/lsb-release' o mejor'/etc/os-release' –

0

Python 2 no detecta correctamente Arch Linux. Esto se ha corregido en Python 3.3+, pero nunca fue portado a back-Python 2. Aquí hay un par de informes oficiales de errores:

https://bugs.python.org/issue20454
https://bugs.python.org/issue11678

Una solución para este problema en Python 2 es bastante sencillo. Sólo tiene que decirle al módulo de plataforma que "arco" es una distribución apoyado:

>>> import platform 
>>> platform.linux_distribution(supported_dists=platform._supported_dists + ('arch',)) 
('arch', '', '') 

Tenga en cuenta que Arch Linux es una versión de rodadura, por lo que no tiene una versión o la identificación.

El argumento supported_dists está documentado here, aunque no encuentro la documentación muy clara. No desea sobreescribir _supported_dists porque entonces su código será solo trabajando en Arch Linux. Quieres anexar a la tupla. De hecho, si imprime el valor de platform._supported_dists, verá que la única diferencia entre Python 2.7.12 y Python 3.5.1 es la adición de ('arch', 'mageia'). Dato curioso: también puede agregar 'system' para la detección de plataformas en Amazon Linux.

2

El motivo por el cual platform.linux_distribution no identifica algunas distribuciones se debe a que las distribuciones de formas no estandarizadas proporcionan información relacionada con la versión en sí mismas.

He escrito un paquete llamado distro (ahora utilizado por pip) cuyo objetivo es reemplazar distro.linux_distribution. Funciona en muchas distribuciones que pueden devolver tuplas extrañas o vacías al usar platform.

https://github.com/nir0s/distro (distro, en PyPI)

Proporciona una API mucho más elaborado para recuperar información relacionada con la distribución.

$ python 
Python 2.7.12 (default, Nov 7 2016, 11:55:55) 
[GCC 6.2.1 20160830] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import distro 
>>> distro.linux_distribution() 
(u'Antergos Linux', '', u'ARCHCODE') 

Por cierto, platform.linux_distribution debe ser eliminado en Python 3.7.

Cuestiones relacionadas