Quando usar os.name, sys.plataforma ou plataforma.sistema?

tanto quanto sei, o Python tem 3 formas de descobrir em que sistema operativo está a correr:

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

saber esta informação é muitas vezes útil em importações condicionais, ou usando uma funcionalidade que difere entre plataformas (por exemplo time.clock() no Windows v. s. time.time() no UNIX).

A minha pergunta é: porquê três maneiras diferentes de fazer isto? Quando se deve usar uma maneira e não outra? Para que lado é o "melhor" (mais à prova de futuro ou menos provável de excluir acidentalmente um sistema em particular que o seu programa pode realmente executar)?

parece Que sys.platform é mais específico do que os.name, permitindo-lhe distinguir win32 de cygwin (por oposição a apenas nt), e linux2 de darwin (por oposição a apenas posix). Mas se for assim, que tal a diferença entre sys.platform e platform.system()?

por exemplo, o que é melhor, isto:

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

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff
Por agora vou estar aderindo a [[[3]], então esta questão não é particularmente urgente, mas eu ficaria muito grato por algum esclarecimento a respeito disso.

Author: CharlesB, 2010-12-29

5 answers

Mergulhei um pouco no código fonte.

Os resultados de sys.platform e os.name são determinados no momento da compilação. platform.system() determina o tipo de Sistema na hora de execução.

  • sys.platform é indicado como um compilador define durante a configuração de compilação.
  • os.name verifica se determinados módulos específicos do SO estão disponíveis (ex. posix, nt, ...)
  • platform.system() Funciona realmente uname e potencialmente várias outras funções para determinar o tipo de sistema em execução tempo.

Minha sugestão, use os.name para verificar se é um sistema compatível com posix, use {[[0]} para verificar se é um linux, cygwin, darwin, ateos, o que quer que seja, e use {[[2]}, bem, se você não acredita nas outras fontes.

 51
Author: moooeeeep, 2012-07-26 17:43:48
Há uma pequena diferença de linha entre platform.system() e {[3] } e interessante para a maioria dos casos platform.system() degenera para sys.platform Eis o que a fonte diz:
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 = ''

Também de acordo com a documentação

Os.uname ()

Devolve uma 5-tupla contendo informações que identifiquem o sistema operativo actual. A tupla contém 5 strings: (sysname, nodename, release, version, machine). Alguns sistemas truncam o nome de notename para 8 caracteres ou para o componente líder; uma forma melhor de obter o o nome da máquina é socket.gethostname () ou mesmo soquete.gethostbyaddr (socket.gethostname ()).

Availability: recent flavors of Unix.
 19
Author: Abhijit, 2013-01-13 06:09:45

De sys.platform docs:

  • os.name tem uma granularidade mais grosseira
  • os.uname() dá informações de versão dependentes do sistema
  • a platform O módulo fornece controlos pormenorizados da identidade do sistema

Muitas vezes, a melhor forma de testar se alguma funcionalidade está disponível é tentar usá-la e usar um recurso se falhar.

E a diferença entre sys.plataforma e plataforma.sistema()?

platform.system() devolve um valor normalizado que pode obter de várias fontes: os.uname(), sys.platform, ver comando (no Windows).

 10
Author: jfs, 2012-07-26 15:21:32

Propriedade.)

  • Os.name é uma resolução suficiente para a utilização correcta do módulo os. Os valores possíveis são 'posix', 'nt', 'os2', 'ce', 'java' ou 'manchete' em Python 2.7, enquanto que apenas os 'posix', 'nt' e 'java' são usados desde Python 3.4.

  • Sys.a plataforma é uma resolução mais fina. Recomenda-se o uso do idioma if sys.platform.startswith('linux') porque "linux2" significa um kernel Linux versão 2.xx ou 3. Os kernels mais antigos nunca são usados. Em Python 3.3 são todos os sistemas Linux simples 'linux'.

Não conheço os detalhes dos sistemas" Mac" e "Java" e por isso não posso usar os resultados de uma plataforma de métodos muito boa.system () for branching, but I would use advantages of the platform module for messages and error logging.

 8
Author: hynekcer, 2018-07-24 21:57:15

Eu acredito que o módulo de plataforma é provavelmente preferido para um novo código. Os outros existiam antes. É uma evolução, e os outros permanecem para trás compatibilidade.

 2
Author: Keith, 2010-12-29 10:05:37