Vérifiez le nom de la distribution Linux
- Je obtenir la distribution Linux nom à partir d'un script Python. Il y a un dist
méthode dans le module de plate-forme:
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 obsolète depuis la 2.6.
>>> platform.linux_distribution()
('', '', '')
- Je veux dire au sujet d'obtenir exactement au nom de script python sans analyse des fichiers, seulement standart méthodes.
- ce n'
uname -a
retour sur l'Arche? platform.py est de 1600 lignes d'essayer tout ce qu'ils pouvaient penser de distinguer les différents systèmes; c'est un énorme tas de méthodes heuristiques. Arch semble être basée seulement sur lui-même, aucun autre distro: en.wikipedia.org/wiki/Arch_Linux - Ce n'
lsb_release -is
retour sous Arch? Siplatform.dist()
vous donne pas de données exploitables, peut-être que vous pouvez appelersubprocess.check_output(["lsb_release","-is"])
à la place. - Pour les googlers, voici une question connexe: Comment puis-je détecter la version Ubuntu?
- Pour info linux_distribution est obsolète depuis 3.5
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne pour moi sous Ubuntu:
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 c'est cette partie:Donc, il n'y a
/etc/lsb-release
contenant cette information, qui vient de Ubuntu Debian de base-package de fichiers./etc/os-release
.Ici's ce que j'ai trouvé:
Il dit
platform.dist
est obsolète depuis la 2.6, vous devez utiliserplatform.linux_distribution
en Python 2 (mais il est aussi déconseillé en Python 3.5).Cela fonctionne ici. Et non, Arch Linux n'est pas basée sur Debian.
Donc Python ne sais pas comment faire pour obtenir l'Arc de version de Linux de l'information, et il est codé en dur à la recherche pour /etc/redhat-release et /etc/SuSE-libération.
plate-forme.dist() est une fonction obsolète. Vous devez utiliser la plate-forme.linux_distribution()
En fait, sur mon système, il donne un résultat différent:
plate-forme.linux_distribution() regarde dans /etc fichiers contenant des "libération" ou "version" en tant que chaîne de caractères. Aussi, il semble dans la norme LSB fichier release. Si à la fin cela ne fonctionne pas, il recourt à un _dist_try_harder fonction qui tente d'obtenir l'information d'autres lieux.
Donc, c'est à Arch Linux pour fournir un niveau LSB de communiquer des renseignements ou de patch Python à utiliser leur "manière".
La raison à cause de laquelle
platform.linux_distribution
ne permet pas d'identifier certaines distributions est en raison de la non-standardisé moyen des distributions fournissent version de renseignements sur eux-mêmes.J'ai écrit un paquet appelé
distro
(maintenant utilisé parpip
), qui vise à remplacerdistro.linux_distribution
. Il fonctionne sur de nombreuses distributions qui pourrait revenir bizarre ou vide de n-uplets lors de l'utilisation deplatform
.https://github.com/nir0s/distro (
distro
, sur pypi)Il fournit une quantité plus élaborée de l'API pour récupérer de la distribution de l'information.
Par la voie,
platform.linux_distribution
est d'être supprimé en Python 3.7.Python 2 n'est pas détecté correctement Arch Linux. Cela a été corrigé dans Python 3.3,+, mais n'a jamais été rétroportés pour Python 2. Voici un couple de officiel les rapports de bug:
https://bugs.python.org/issue20454
https://bugs.python.org/issue11678
Une solution de contournement pour ce problème en Python 2 est assez simple. Vous avez juste besoin de dire à la plate-forme de module "arche" est une prise en charge de la distribution:
Noter que Arch Linux est une rolling release, afin de ne pas avoir une version ou l'id.
La
supported_dists
argument est documenté ici, bien que je n'ai pas trouver de la documentation très claire. Vous ne voulez pas écraser_supported_dists
parce qu'alors votre code seulement travail sur Arch Linux. Vous souhaitez ajouter à la n-uplet.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'
de la plate-forme de détection sur Amazon Linux.Cela a fonctionné pour moi sous Ubuntu et Manjaro:
/etc/issue
est pour le spectacle de bienvenue ligne sur console standard et, très souvent, est modifié par l'utilisateur/admin. De manière Standard pour détecter moderne distro est d'analyser/etc/lsb-release
ou mieux/etc/os-release
Deux options pour vous:
Utilisation
l'importation de la plateforme
la plate-forme.linux_distribution()
# Quelque chose comme ('Ubuntu', '9.10', 'karmique')
Ou vous pouvez simplement lire le contenu de /etc/debian_version ("squeeze/sid") ou /etc/lsb-release qui donnerait:
Si vous voulez de l'utilisateur des données lisibles mais encore détaillé, vous pouvez utiliser la plate-forme.la plate-forme()
Voici quelques différents types d'appels que vous pouvez faire à identifier où vous êtes
La sortie de ce script s'est exécuté sur différents systèmes (Linux, Windows, Solaris, MacOS) et des architectures (x86, x64 et Itanium, power pc, sparc) est disponible ici: https://github.com/hpcugent/easybuild/wiki/OS_flavor_name_version
Vous aurez probablement avoir recours à:
ou vous pouvez toujours augmenter lib/python2.6/platform.py et nous envoyer vos modifications.
platform
ne peut pas détecter. Amazon Linux aussi vide de n-uplet.