python - ejecutar - Compruebe el nombre de la distribución de Linux
instalar python en debian 9 (8)
Dos opciones para ti:
Use la plataforma de importación platform.linux_distribution () # Algo así como (''Ubuntu'', ''9.10'', ''karmic'')
O simplemente puedes leer el contenido de / etc / debian_version ("squeeze / sid") o / etc / lsb-release que daría:
DISTRIB_ID=Ubunt DISTRIB_RELEASE=9.10 DISTRIB_CODENAME=karmic DISTRIB_DESCRIPTION="Ubuntu 9.10"
Tengo que obtener el nombre de distribución de Linux de un script de Python. Hay un método dist
en el módulo de plataforma:
import platform
platform.dist()
Pero bajo mi Arch Linux vuelve:
>>> platform.dist()
('''', '''', '''')
¿Por qué? ¿Cómo puedo obtener el nombre?
PD. Tengo que comprobar si la distribución está basada en Debian.
Actualización: Encontré aquí el sitio de Python , que dist () está en desuso desde 2.6.
>>> platform.linux_distribution()
('''', '''', '''')
Esto es lo que encontré:
platform.linux_distribution
Intenta determinar el nombre del nombre de distribución del sistema operativo Linux.
Dice que platform.dist
está en desuso desde la versión 2.6, tiene que usar platform.linux_distribution
en Python 2 (pero también está en desuso en Python 3.5).
Esto me funcionó 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]
Esto me funciona en Ubuntu:
(''Ubuntu'', ''10.04'', ''lucid'')
Luego usé strace
para averiguar qué está haciendo exactamente el módulo de la plataforma 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
Por lo tanto, hay /etc/lsb-release
contiene esta información, que viene del paquete Debian base-files de Ubuntu.
Funciona aqui Y no, Arch Linux no está basado en Debian.
>>> import platform
>>> platform.dist()
(''SuSE'', ''11.2'', ''x86_64'')
Por lo tanto, Python no sabe cómo obtener la información de la versión de Arch Linux, y ha codificado en busca de / etc / redhat-release y / etc / SuSE-release.
platform.dist () es una función obsoleta. Deberías usar platform.linux_distribution ()
En realidad, en mi sistema produce un resultado diferente:
>>> platform.linux_distribution()
(''openSUSE '', ''11.2'', ''x86_64'')
platform.linux_distribution () busca en los archivos / etc que contienen "release" o "version" como una cadena. También se ve en el archivo de versión estándar de LSB. Si al final eso no funcionó, recurre a una función _dist_try_harder que intenta obtener la información de otros lugares.
Por lo tanto, depende de Arch Linux proporcionar una información de lanzamiento de LSB estándar o parchear Python para usar su "camino".
La razón por la cual platform.linux_distribution
no identifica algunas distribuciones se debe a la forma no estandarizada en que las distribuciones proporcionan información relacionada con la versión sobre ellas mismas.
He escrito un paquete llamado distro
(ahora usado por pip
) que apunta a reemplazar distro.linux_distribution
. Funciona en muchas distribuciones que pueden devolver tuplas extrañas o vacías al usar la platform
.
https://github.com/nir0s/distro ( distro
, en pypi)
Proporciona una API mucho más elaborada 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
se eliminará en Python 3.7.
Probablemente tendrás que recurrir a:
if platform.linux_distribution() == ('''', '''', ''''):
# do something specific to look for Arch
o siempre puede aumentar lib / python2.6 / platform.py y enviar sus cambios.
Python 2 no detecta correctamente Arch Linux. Esto se solucionó en Python 3.3+, pero nunca se realizó una copia de seguridad de Python 2. Aquí hay un par de informes de errores oficiales:
https://bugs.python.org/issue20454
https://bugs.python.org/issue11678
Una solución para este problema en Python 2 es bastante simple. Solo debe indicar al módulo de plataforma que "arch" es una distribución compatible:
>>> import platform
>>> platform.linux_distribution(supported_dists=platform._supported_dists + (''arch'',))
(''arch'', '''', '''')
Tenga en cuenta que Arch Linux es una versión móvil, por lo que no tiene una versión o id.
El argumento support_dists está documentado here , aunque no encuentro la documentación muy clara. No desea sobrescribir las _supported_dists
porque entonces su código solo funcionará en Arch Linux. Quieres añadirla 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 la plataforma en Amazon Linux.