Pregunta ¿Cuándo usar os.name, sys.platform o platform.system?


Hasta donde yo sé, Python tiene 3 formas de descubrir en qué sistema operativo se está ejecutando:

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

Saber esta información a menudo es útil en importaciones condicionales, o al usar una funcionalidad que difiere entre plataformas (p. time.clock() en Windows v.s. time.time() en UNIX).

Mi pregunta es, ¿por qué 3 formas diferentes de hacer esto? ¿Cuándo debería usarse una vía y no otra? ¿De qué manera es el "mejor" (más a prueba de futuro o menos probable que excluya accidentalmente un sistema en particular en el que se puede ejecutar realmente su programa)?

Parece que sys.platform es más específico que os.name, lo que te permite distinguir win32 de cygwin (en comparación con solo nt), y linux2 de darwin (en comparación con solo posix) Pero si eso es así, ¿qué pasa con la diferencia entre sys.platform y platform.system()?

Por ejemplo, que es mejor, esto:

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

¿o esto? :

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

Por ahora me apegaré a sys.platform, entonces esta pregunta no es particularmente urgente, pero estaría muy agradecido por alguna aclaración con respecto a esto.


74
2017-12-29 10:01


origen


Respuestas:


Se sumergió un poco en el código fuente.

El resultado de sys.platform y os.name se determinan en tiempo de compilación. platform.system() determina el tipo de sistema en tiempo de ejecución.

  • sys.platform se especifica como un compilador define durante la configuración de compilación.
  • os.name verifica si ciertos módulos específicos de os están disponibles (p. posix, nt, ...)
  • platform.system() en realidad se ejecuta uname y potencialmente varias otras funciones para determinar el tipo de sistema en tiempo de ejecución.

Mi sugerencia, uso os.name para verificar si es un sistema compatible con posix, use sys.platform para comprobar si se trata de un linux, cygwin, darwin, atheos, lo que sea, y el uso platform.system(), bueno, si no crees las otras fuentes.


51
2017-07-26 17:43



Hay una delgada línea de diferencia entre platform.system() y sys.platform y curiosamente para la mayoría de los casos platform.system() degenera a sys.platform

Aquí está lo que la Fuente Python2.7\Lib\Platform.py\system dice

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 = ''

También por el documentación

os.uname ()

Regrese una información de 5 tuplas que identifique el sistema operativo actual. La tupla contiene 5 cadenas: (sysname, nodename,   versión, versión, máquina). Algunos sistemas truncan el nombre del nodo a 8   personajes o al componente principal; una mejor manera de obtener el   nombre de host es socket.gethostname () o incluso   socket.gethostbyaddr (socket.gethostname ()).

Availability: recent flavors of Unix.

19
2018-01-13 05:58



De sys.platform documentos:

  • os.name tiene una granularidad más gruesa
  • os.uname() proporciona información de versión dependiente del sistema
  • los platform El módulo proporciona comprobaciones detalladas de la identidad del sistema

A menudo, la "mejor" forma a prueba de futuro para probar si alguna funcionalidad está disponible es solo intentar usarla y usar una alternativa si falla.

¿Qué pasa con la diferencia entre sys.platform y platform.system ()?

platform.system() devuelve un valor normalizado que puede obtener de varias fuentes: os.uname(), sys.platform, ver comando (en Windows).


10
2017-07-26 15:21



Depende de si prefiere generar excepciones o probar algo en un sistema no probado y si su código es de un nivel tan alto o tan bajo que puede funcionar o no en un sistema similar no probado (por ejemplo, Mac no probada - 'posix' o en sistemas ARM integrados). Más pythonic es no enumerar todos los sistemas conocidos, sino probar posibles propiedades relevantes. (Por ejemplo, se considera importante la endiabilidad del sistema, pero propiedades de multiprocesamiento sin importancia).

  • os.name es una resolución suficiente para el uso correcto de os módulo. Los valores posibles son 'posix', 'nt', 'os2', 'ce', 'java' o 'riscos' en Python 2.7, mientras que solo se usan 'posix', 'nt' y 'java' desde Python 3.4.

  • sys.platform es una resolución más fina. Se recomienda usar if sys.platform.startswith('linux') idioma porque "linux2" significa un kernel de Linux versión 2.xx o 3. Los kernels más antiguos no se usan actualmente. En Python 3.3 todos los sistemas Linux son simples 'linux'.

No conozco los detalles de los sistemas "Mac" y "Java", por lo que no puedo usar los resultados de un muy buen método platform.system () para la bifurcación, pero utilizaría las ventajas del platform módulo para mensajes y registro de errores.


8
2018-01-13 11:12



Creo que el módulo de plataforma es probablemente el preferido para el nuevo código. Los otros existieron antes de eso. Es una evolución, y los demás siguen siendo compatibles con versiones anteriores.


2
2017-12-29 10:05