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:
os.name
sys.platform
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).
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.
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 realmenteuname
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.
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.
-
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).
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.
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.