Pelo que eu sei, o Python tem três maneiras de descobrir em que sistema operacional está sendo executado:
os.name
sys.platform
platform.system()
Conhecer essas informações geralmente é útil em importações condicionais ou no uso de funcionalidades que diferem entre as plataformas (por exemplo, time.clock()
no Windows x time.time()
UNIX).
Minha pergunta é: por que três maneiras diferentes de fazer isso? Quando uma maneira deve ser usada e não outra? Qual maneira é a 'melhor' (mais preparada para o futuro ou menos provável de excluir acidentalmente um sistema específico no qual seu programa pode realmente ser executado)?
Parece que sys.platform
é mais específico do que os.name
, permitindo a você distinguir win32
de cygwin
(em oposição a apenas nt
) e linux2
de darwin
(em 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, este:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
ou isto? :
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
Por enquanto, irei me limitar a sys.platform
, então esta questão não é particularmente urgente, mas eu ficaria muito grato por alguns esclarecimentos a respeito disso.
fonte
sys.platform.startswith('linux')
vez desys.platform == 'linux2'
para compatibilidade futuraRespostas:
Mergulhei um pouco no código-fonte.
A saída de
sys.platform
eos.name
é determinada em tempo de compilação.platform.system()
determina o tipo de sistema em tempo de execução.sys.platform
é especificado como um compilador definido durante a configuração de construção.os.name
verifica se módulos específicos certa OS estão disponíveis (por exemploposix
,nt
...)platform.system()
realmente executauname
e potencialmente várias outras funções para determinar o tipo de sistema em tempo de execução.Minha sugestão:
os.name
para verificar se é um sistema compatível com posix.sys.platform
para verificar se é um linux, cygwin, darwin, atheos, etc.platform.system()
se você não acreditar nas outras fontes.fonte
Há uma diferença de linha tênue entre
platform.system()
esys.platform
e, curiosamente, para a maioria dos casosplatform.system()
degenera parasys.platform
Aqui está o que a fonte
Python2.7\Lib\Platform.py\system
dizTambém pela documentação
fonte
Dos
sys.platform
documentos :os.name
tem uma granularidade mais grosseiraos.uname()
fornece informações de versão dependentes do sistemaplatform
módulo fornece verificações detalhadas para a identidade do sistemaFreqüentemente, a "melhor" maneira preparada para o futuro de testar se alguma funcionalidade está disponível é apenas tentar usá-la e usar um fallback se ela falhar.
platform.system()
retorna um valor normalizado que pode começar a partir de várias fontes:os.uname()
,sys.platform
,ver
comando (no Windows).fonte
Depende se você prefere gerar exceção ou tentar qualquer coisa em um sistema não testado e se seu código é de nível tão alto ou baixo que pode ou não funcionar em um sistema não testado semelhante (por exemplo, Mac não testado - 'posix' ou em sistemas ARM incorporados). Mais pitônico é não enumerar todos os sistemas conhecidos, mas testar possíveis propriedades relevantes. (por exemplo, é considerado importante o endianess do sistema, mas propriedades de multiprocessamento sem importância.)
os.name é uma resolução suficiente para o uso correto do
os
módulo. Os valores possíveis são 'posix', 'nt', 'os2', 'ce', 'java' ou 'riscos' em Python 2.7, enquanto apenas 'posix', 'nt' e 'java' são usados desde Python 3.4.sys.platform é uma resolução mais precisa. É recomendado usar o
if sys.platform.startswith('linux')
idioma porque "linux2" significa um kernel Linux versão 2.xx ou 3. Kernels mais antigos nunca são usados. No Python 3.3, todos os sistemas Linux são simples 'linux'.Não conheço as especificações dos sistemas "Mac" e "Java" e, portanto, não posso usar os resultados de um método muito bom platform.system () para ramificação, mas usaria as vantagens do
platform
módulo para mensagens e registro de erros.fonte
os.name
possíveis valores de retorno são'posix'
,'nt'
,'java'
de acordo com o Python 3 docs . Veja também: documentação do módulo da plataforma . Eu não acredito'riscos'
e'os2
'são possíveis valores de retorno deos.name
; eles podem ser valores de retorno desys.platform
. A documentação do Python 3sys.platform
não parece ser exaustiva.os.name
era consistente em todas as versões. Também não verifiquei novamente a documentação do 2.7 , mas agora sei que você está correto.Acredito que o módulo da plataforma seja provavelmente o preferido para o novo código. Os outros existiram antes disso. É uma evolução, e as outras permanecem para compatibilidade com versões anteriores.
fonte