Hasta donde yo sé, Python tiene 3 formas de averiguar en qué sistema operativo se está ejecutando:
os.namesys.platformplatform.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.platformes más específico que os.name, lo que le permite distinguir win32de cygwin(en oposición a solo nt) y linux2de darwin(en oposición a solo posix). Pero si es así, ¿qué pasa con la diferencia entre sys.platformy 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.platformyos.namese determina en tiempo de compilación.platform.system()determina el tipo de sistema en tiempo de ejecución.sys.platformse especifica como una definición del compilador durante la configuración de compilación.os.namecheques si los módulos específicos de ciertos OS están disponibles (por ejemploposix,nt, ...)platform.system()realmente se ejecutaunamey potencialmente varias otras funciones para determinar el tipo de sistema en tiempo de ejecución.Mi sugerencia:
os.namepara verificar si es un sistema compatible con posix.sys.platformpara 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.platformy curiosamente para la mayoría de los casosplatform.system()degenerasys.platformEsto es lo que
Python2.7\Lib\Platform.py\systemdice la FuenteTambién según la documentación
fuente
De los
sys.platformdocumentos :os.nametiene una granularidad más gruesaos.uname()proporciona información de versión dependiente del sistemaplatformmó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,vercomandos (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
osmó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
platformmódulo para mensajes y registro de errores.fuente
os.nameposibles 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.platformno parece ser exhaustiva.os.nameera 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