127 votes

Quand utiliser os.name, sys.platform ou platform.system?

Autant que je sache, Python a 3 façons de découvrir ce système d'exploitation est en cours d'exécution sur:

  1. os.name
  2. sys.platform
  3. platform.system()

Sachant cette information est souvent utile dans conditionnelle des importations, ou à l'aide de la fonctionnalité qui diffère entre les plates-formes (par exemple, time.clock() sur Windows c. s. time.time() sur UNIX).

Ma question est, pourquoi les 3 façons différentes de le faire? Quand faut-il moyen d'être utilisé et pas un autre? Qui est le "meilleur" (plus d'avenir ou les moins susceptibles de accidentellement exclure un particulier système de votre programme peut s'exécuter sur)?

Il semble que l' sys.platform plus précis que l' os.name, vous permettant de distinguer win32 de cygwin (contre seulement nt), et linux2 de darwin (contre seulement posix). Mais si c'est le cas, que ce sujet de la différence entre sys.platform et platform.system()?

Par exemple, ce qui est mieux, c':

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

ou cela? :

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

Pour l'instant je vais adhérer sys.platform, de sorte que cette question n'est pas particulièrement urgent, mais je serais très reconnaissant à apporter quelques éclaircissements à ce sujet.

80voto

moooeeeep Points 10167

Plongé un peu dans le code source.

La sortie de l' sys.platform et os.name sont déterminés au moment de la compilation. platform.system() détermine le type de système au moment de l'exécution.

  • sys.platform est spécifié comme un compilateur définir lors de la configuration de build.
  • os.name vérifie si certains os des modules spécifiques sont disponibles (par exemple, posix, nt, ...)
  • platform.system() tourne réellement uname et potentiellement plusieurs autres fonctions, afin de déterminer le type de système au moment de l'exécution.

Ma suggestion, utilisez os.name afin de vérifier si elle est conforme à posix système, utilisez sys.platform pour vérifier si c'est un linux, cygwin, darwin, atheos, que ce soit, et d'utiliser platform.system(), eh bien, si vous ne croyez pas les autres sources.

22voto

Abhijit Points 24122

Il y a une mince ligne de la différence entre platform.system() et sys.platform et il est intéressant de noter que pour la plupart des cas platform.system() dégénère à sys.platform

Voici ce que la Source Python2.7\Lib\Platform.py\system dit

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

Aussi par la documentation

os.uname()

De retour 5-tuple contenant les informations d'identification du système d'exploitation actuel. Le tuple contient 5 chaînes: (de type sysname, nodename, version, la version de la machine). Certains systèmes de tronquer la nodename à 8 les caractères ou pour la composante de premier plan; une meilleure façon d'obtenir la le nom de domaine est prise.gethostname() ou même socket.gethostbyaddr(socket.gethostname()).

Availability: recent flavors of Unix.

11voto

J.F. Sebastian Points 102961

D' sys.platform docs:

  • os.name a une granularité grossière
  • os.uname() donne dépendant du système d'informations de version
  • L' platform module fournit des vérifications détaillées pour le système de l'identité

Souvent, la "meilleure" manière pérenne pour tester si certaines fonctionnalités sont disponibles, c'est juste pour essayer de l'utiliser et d'utiliser une solution de repli en cas d'échec.

que dire de la différence entre les sys.plate-forme et la plate-forme.system()?

platform.system() renvoie une valeur normalisée qu'il pourrait obtenir à partir de plusieurs sources: os.uname(), sys.platform, ver de commande (sous Windows).

10voto

hynekcer Points 2265

Cela dépend si vous préférez la levée de l'exception ou de tenter quoi que ce soit sur un système non testé et si votre code est ainsi de haut niveau ou de sorte qu'il peut ou ne peut pas travailler sur les mêmes non testés système (par exemple, non testé Mac - 'posix" ou sur des systèmes de BRAS). Plus pythonic est de ne pas énumérer tous les systèmes connus, mais afin de tester les propriétés pertinentes. (par exemple, il est jugé important que l'endianess du système, mais sans importance multitraitement propriétés.)

  • os.le nom est une résolution suffisante pour l'utilisation correcte de l' os module. Les valeurs possibles sont 'posix', 'nt', 'os2', 'ce' ou 'riscos" où, probablement, seulement les deux premiers sont pour la plupart important.

  • sys.plate-forme est une résolution plus fine. Il est recommandé d'utiliser if sys.platform.startswith('linux') idiome parce que "linux2" désigne un noyau Linux version 2.xx ou 3. Les anciens noyaux sont actuellement jamais utilisé. En Python 3.3 sont tous les systèmes Linux simple "linux".

Je ne connais pas les détails de "Mac" et "Java" et donc je ne peux pas utiliser les résultats de très bonne méthode de plate-forme.system() pour la ramification, mais je voudrais utiliser les avantages de l' platform module pour les messages et la journalisation des erreurs.

3voto

Keith Points 13800

Je crois que le module de plate-forme est probablement préféré pour le nouveau code. Les autres existaient avant elle. C'est une évolution, et les autres restent pour la compatibilité ascendante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X