2009-09-07 17 views
40

Estoy trabajando en un par de herramientas Linux y necesito evitar la instalación en Windows, ya que depende de FHS y por lo tanto se vuelve inútil en esa plataforma. La función platform.platform se acerca pero solo devuelve una cadena.Detectar Windows de forma segura en Python

Desafortunadamente, no sé qué buscar en esa cadena para que arroje un resultado confiable. ¿Alguien sabe qué buscar o alguien sabe de otra función que me falta aquí?

Respuesta

58
>>> import platform 
>>> platform.system() 
'Windows' 
9

Prueba esto:

import platform 

if platform.system() == "Darwin": 
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it 

Editar: acabamos de ver que ha intentado platform.platform() ... platform.system() funcionan mejor para este caso. Confía en mí, úsala. Las esquinas oscuras se encuentran en la detección de la plataforma.

distutils hará esto también, si lo pide amablemente.

Siempre puede hacer algo malo, como os.path.exists() en un archivo de Windows ... pero platform es tan confiable como en la biblioteca estándar de Python.

Editar 2: Otro contestador útil señaló platform.system() es exactamente igual a "Windows" en su máquina con Windows.

+1

Tampoco tengo Windows a mano, pero esta función devuelve 'Linux' en mi pc. Los documentos parecen mencionar "Windows", así que supongo que seguiré con eso y espero que cubra todos los casos. – blokkie

+0

Debería. Ver la respuesta de Pax. –

+0

Ah, tus ediciones lo aclararon. Muy agradecido. – blokkie

16

En mi caja de Windows, platform.system() devuelve 'Windows'.

Sin embargo, no estoy seguro de por qué te molestarías. Si desea limitar la plataforma en la que se ejecuta tecnológicamente, usaría una lista blanca en lugar de una lista negra.

De hecho, yo no lo haría tecnológicamente en absoluto ya que quizás la próxima versión de Python puede tener lugar de Win32/Win64Windows (por negro-lista) y *nix en lugar de Linux (por listas blancas).

Mi consejo es simplemente indicar cuáles son los requisitos y, si el usuario elige ignorar eso, ese es su problema. Si llaman diciendo que recibieron un mensaje de error que dice "No se puede encontrar FHS" y admiten que se están ejecutando en Windows, indíquenles que no es una configuración compatible.

Quizás sus clientes sean lo suficientemente inteligentes como para ejecutar FHS en Windows para que su código funcione. Es poco probable que aprecien lo que considerarían una limitación arbitraria de su software.

Este es un problema que enfrentan los desarrolladores de software todos los días. Incluso las grandes organizaciones no pueden admitir cada plataforma única y configuración.

+1

+1, buena respuesta y estoy de acuerdo. Detectar que FHS no está disponible es un método mucho mejor que detectar el sistema operativo y asumirlo, y es más seguro (después de todo, hacer que alguien piratee el límite de su plataforma va a fallar * de todos modos *!). –

+0

+1, sí, una lista blanca es preferible ya que los casos de las esquinas son desagradables. Corriendo bajo Cygwin en una caja de Windows obtengo 'platform.system()' devolviendo 'CYGWIN_NT-5.2-WOW64'. ¡Esa no hubiera sido mi primera suposición! –

2

De ayuda (plataforma)

system() 
    Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'. 

    An empty string is returned if the value cannot be determined. 
5
>>> import os 
>>> os.name 
'nt' 

"El nombre del módulo depende del sistema operativo importados Los siguientes nombres han actualmente han registrado:. 'Posix', 'NT', ' mac ',' os2 ',' ce ',' java ',' riscos '."(C) http://docs.python.org/library/os.html#os.name

import os 
if os.name == 'nt': 
    #yourcodehere 
+0

Al menos en mi caja 'os.name' devuelve' posix' cuando se ejecuta en Cygwin, y 'nt' cuando se ejecuta en ventanas nativas build – sbk

+0

Sí, Cygwin es un dolor, pero para la historia original este comportamiento es aceptado (si no se desea) –

46

Para aquellos que vinieron aquí en busca de una manera de detectar Cygwin desde Python (en lugar de sólo la detección de Windows), aquí hay algunos valores de ejemplo de retorno de os.name y platform.system en diferentes plataformas

OS/build  | os.name | platform.system() 
-------------+---------+----------------------- 
Win32 native | nt  | Windows 
Win32 cygwin | posix | CYGWIN_NT-5.1* 
Win64 native | nt  | Windows 
Win64 cygwin | posix | CYGWIN_NT-6.1-WOW64* 
Linux  | posix | Linux 

a partir de este punto, cómo distinguir entre Windows nativo y Cygwin que debería ser obvio, aunque no estoy convencido de que esto es una prueba de futuro.

* son números de versión para XP y Win7 respecti vely, no confíe en ellos

+3

Mi Cygwin muestra "Windows". –

+0

@JaceBrowning: es suficiente, probablemente estamos usando versiones diferentes de Cygwin o Python ... Aquí es donde aparece la nota "no a prueba de futuro" :) – sbk

+0

la diferencia es que mi instalación de Python es probablemente parte de Windows, no a través de Cygwin? –

Cuestiones relacionadas