2010-05-03 5 views
22

Je dois obtenir le nom de la distribution Linux à partir d'un script Python. Il existe une méthode dist dans le module de plate-forme:Vérifiez le nom de la distribution Linux

import platform 
platform.dist() 

Mais sous mon Arch Linux il retourne:

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

Pourquoi? Comment puis-je obtenir le nom?

PS. Je dois vérifier si la distribution est basée sur Debian.


Mise à jour: J'ai trouvé ici Python site, que dist() est dépréciée depuis 2.6.

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

@Kimvais Je veux dire obtenir un nom exactement à partir du script python sans analyser les fichiers, seulement des méthodes standard. – Ockonal

+0

Que retourne 'uname -a' sur Arch? platform.py est 1600 lignes d'essayer tout ce qu'ils peuvent penser pour distinguer différents systèmes; c'est un énorme tas d'heuristiques. Arch semble également être basé uniquement sur lui-même, pas d'autre distribution: http://en.wikipedia.org/wiki/Arch_Linux – msw

+0

Que retourne 'lsb_release -is' sous Arch? Si 'platform.dist()' ne vous donne aucune donnée utilisable, vous pouvez peut-être appeler 'subprocess.check_output ([" lsb_release "," - is "])' à la place. – panzi

Répondre

9

Cela fonctionne pour moi sur Ubuntu:

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

J'ai ensuite utilisé strace pour savoir exactement ce que le module de plate-forme est en train de faire pour trouver la distribution, et il est cette partie:

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 

Donc, il y a /etc/lsb-release contenant cette information, qui vient du paquet Debian base-files d'Ubuntu.

+0

Notez que parfois le fichier est '/ etc/os-release'. – panzi

12

Here « s ce que je trouve:

platform.linux_distribution 

tente de déterminer le nom du nom de distribution Linux OS.

Il dit platform.dist est Déconseillédepuis 2.6, vous devez utiliser platform.linux_distribution en Python 2 (mais il est également dépréciés dans Python 3.5).

0

Deux options pour vous:

  1. utilisation plate-forme d'importation de platform.linux_distribution() # Quelque chose comme ('Ubuntu', '9.10', 'karmique')

  2. Ou vous pourrait simplement lire le contenu du fichier/etc/debian_version ("squeeze/sid") ou/etc/lsb-release qui donnerait:

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

Malheureusement, la première option ne fonctionne pas sur Arch Linux. Je n'ai pas accès à Arch pour le moment, donc je ne peux pas tester la seconde option. –

4

Cela fonctionne ici. Et non, Arch Linux n'est pas basé sur Debian.

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

Alors Python ne sait pas comment obtenir les informations de version Arch Linux, et il a hardcoded recherche/etc/redhat-release et/etc/SuSE-release.

platform.dist() est une fonction obsolète. Vous devriez utiliser la plate-forme.linux_distribution()

En fait, sur mon système, il donne un résultat différent:

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

platform.linux_distribution() regarde dans/etc fichiers contenant "release" ou "version" sous forme de chaîne. Il regarde également dans le fichier de version LSB standard. Si à la fin cela ne fonctionnait pas, il utilise une fonction _dist_try_harder qui essaie d'obtenir l'information d'autres endroits.

Il appartient donc à Arch Linux de fournir des informations de version LSB standard ou de patcher Python pour utiliser leur "chemin".

-1

Vous aurez probablement recours à:

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

ou vous pouvez toujours augmenter lib/python2.6/platform.py et envoyez vos modifications.

+1

Ce type de comparaison est dangereux car Arch Linux n'est pas la seule distribution que 'platform' ne peut pas détecter. Amazon Linux entraîne également un tuple vide. –

1

Cela a fonctionné pour moi sous Ubuntu et Manjaro:

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

Cela fonctionne sous Arch Linux;) – nachopro

+1

pas une bonne idée, '/ etc/issue' est pour montrer la ligne de bienvenue sur la console standard et très souvent est modifié par l'utilisateur/admin. La manière standard de détecter la distribution moderne est d'analyser '/ etc/lsb-release' ou mieux'/etc/os-release' –

0

Python 2 ne détecte pas correctement Arch Linux. Ceci a été corrigé en Python 3.3+, mais n'a jamais été arrière-Python porté sur 2. Voici quelques rapports de bogues officiels:

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

Une solution à ce problème en Python 2 est assez simple. Vous avez juste besoin de dire le module de plate-forme « arc » est une distribution soutenue:

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

Notez que Arch Linux est une version de roulement, de sorte qu'il ne dispose pas d'une version ou l'identifiant.

L'argument supported_dists est documenté here, bien que je ne trouve pas la documentation très claire. Vous ne voulez pas remplacer _supported_dists parce que votre code seulement fonctionnera sur Arch Linux. Vous voulez ajouter au tuple.

En fait, si vous imprimez la valeur de platform._supported_dists, vous verrez que la seule différence entre Python 2.7.12 et Python 3.5.1 est l'ajout de ('arch', 'mageia'). Fait amusant: vous pouvez également ajouter 'system' pour la détection de plate-forme sur Amazon Linux.

2

La raison pour laquelle platform.linux_distribution n'identifie pas certaines distributions est due au fait que les distributions non standardisées fournissent des informations liées à la version sur elles-mêmes.

J'ai écrit un paquet appelé distro (maintenant utilisé par pip) qui vise à remplacer distro.linux_distribution. Cela fonctionne sur beaucoup de distributions qui pourraient renvoyer des tuples étranges ou vides en utilisant platform.

https://github.com/nir0s/distro (distro, sur pypi)

Il fournit une API beaucoup plus complexe pour récupérer des informations liées à la distribution.

$ 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') 

Par ailleurs, platform.linux_distribution doit être supprimé en Python 3.7.

Questions connexes