Hasta donde yo sé, Python tiene 3 formas de averiguar en qué sistema operativo se está ejecutando:
os.name
sys.platform
platform.system()
Conocer esta información suele ser útil en importaciones condicionales o en el uso de funciones que difieren entre plataformas (por ejemplo, time.clock()
en Windows frente a time.time()
en UNIX).
Mi pregunta es, ¿por qué 3 formas diferentes de hacer esto? ¿Cuándo se debe utilizar una forma y no otra? ¿Cuál es la "mejor" (la más preparada para el futuro o la que es menos probable que excluya accidentalmente un sistema en particular en el que su programa puede ejecutarse)?
Parece que sys.platform
es más específico que os.name
, lo que le permite distinguir win32
de cygwin
(en oposición a solo nt
) y linux2
de darwin
(en oposición a solo posix
). Pero si es así, ¿qué pasa con la diferencia entre sys.platform
y platform.system()
?
Por ejemplo, cuál 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 atendré sys.platform
, por lo que esta pregunta no es particularmente urgente, pero estaría muy agradecido por alguna aclaración al respecto.
fuente
sys.platform.startswith('linux')
lugar desys.platform == 'linux2'
para compatibilidad futuraRespuestas:
Buceé un poco en el código fuente.
La salida de
sys.platform
yos.name
se determina en tiempo de compilación.platform.system()
determina el tipo de sistema en tiempo de ejecución.sys.platform
se especifica como una definición del compilador durante la configuración de compilación.os.name
cheques si los módulos específicos de ciertos OS están disponibles (por ejemploposix
,nt
, ...)platform.system()
realmente se ejecutauname
y potencialmente varias otras funciones para determinar el tipo de sistema en tiempo de ejecución.Mi sugerencia:
os.name
para verificar si es un sistema compatible con posix.sys.platform
para verificar si es linux, cygwin, darwin, atheos, etc.platform.system()
si no cree en las otras fuentes.fuente
Hay una delgada diferencia entre
platform.system()
y,sys.platform
y curiosamente para la mayoría de los casosplatform.system()
degenerasys.platform
Esto es lo que
Python2.7\Lib\Platform.py\system
dice la FuenteTambién según la documentación
fuente
De los
sys.platform
documentos :os.name
tiene una granularidad más gruesaos.uname()
proporciona información de versión dependiente del sistemaplatform
módulo proporciona comprobaciones detalladas de la identidad del sistema.A menudo, la "mejor" forma a prueba de futuro de probar si alguna funcionalidad está disponible es simplemente intentar usarla y usar una alternativa si falla.
platform.system()
devuelve un valor normalizado que podría obtener de varias fuentes:os.uname()
,sys.platform
,ver
comandos (en Windows).fuente
Depende de si prefiere generar una excepción o probar algo en un sistema no probado y si su código es de un nivel tan alto o tan bajo que puede o no puede funcionar en un sistema similar no probado (por ejemplo, Mac no probado - 'posix' o en sistemas ARM integrados). Más pitónico 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 del
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 tiene una resolución más fina. Se recomienda usar
if sys.platform.startswith('linux')
modismo porque "linux2" significa una versión de kernel de Linux 2.xx o 3. Actualmente, los kernels más antiguos nunca se usan. 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 del muy buen método platform.system () para ramificar, pero usaría las ventajas del
platform
módulo para mensajes y registro de errores.fuente
os.name
posibles valores de retorno son'posix'
,'nt'
,'java'
de acuerdo con Python 3 docs . Consulte también: documentos del módulo de plataforma . Yo no creo'riscos'
y'os2
'son posibles valores de retorno deos.name
; pueden ser valores de retorno desys.platform
. La documentación de Python 3sys.platform
no parece ser exhaustiva.os.name
era consistente en todas las versiones. Tampoco verifiqué la documentación 2.7 , pero ahora sé que estás en lo correcto.Creo que el módulo de plataforma probablemente sea el preferido para el nuevo código. Los otros existieron antes que él. Es una evolución, y los demás permanecen por compatibilidad con versiones anteriores.
fuente