Detección fiable de Windows en Python


Estoy trabajando en un par de herramientas de 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.

Desafortunadamente no se que buscar en esa cadena para que produzca un resultado confiable. ¿Alguien sabe qué buscar o ¿alguien sabe de otra función que me estoy perdiendo aquí?

Author: blokkie, 2009-09-07

6 answers

>>> import platform
>>> platform.system()
'Windows'
 64
Author: Matthew Iselin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-07 01:33:31

Para aquellos que vinieron aquí buscando una manera de detectar Cygwin desde Python (en lugar de solo detectar Windows), aquí hay algunos valores de retorno de ejemplo 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

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

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

 48
Author: sbk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-03 16:32:35

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

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

De hecho, no lo haría tecnológicamente en absoluto, ya que quizás la próxima versión de Python tenga Win32/Win64 en lugar de Windows (para listas negras) y *nix en lugar de Linux (para 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 tienen un mensaje de error que indica "No se puede encontrar FHS" y admiten que se están ejecutando en Windows, señalarles suavemente que no es una configuración compatible.

Tal vez sus clientes sean lo suficientemente inteligentes como para que FHS se ejecute 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 soportar cada plataforma única y configuración por ahí.

 16
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-07 23:40:57

Prueba esto:

import platform

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

Editar: Acabo de ver que intentaste platform.platform()...platform.system() funcionará mejor para este caso. Confía en mí, úsalo. Las esquinas oscuras se encuentran en la detección de la plataforma.

distutils haré esto también, si lo pides amablemente.

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

Edit 2: Otro respondedor útil señaló platform.system() es exactamente igual a "Windows" en su Máquina de Windows.

 9
Author: Jed Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-07 01:31:03
>>> import os
>>> os.name
'nt'

" El nombre del módulo dependiente del sistema operativo importado. Actualmente se han registrado los siguientes nombres: 'posix',' nt',' mac',' os2',' ce',' java','riscos'. c) http://docs.python.org/library/os.html#os.name

import os
if os.name == 'nt':
    #yourcodehere
 7
Author: anatoly techtonik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-17 14:10:42

Desde 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.
 2
Author: boatcoder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-12 15:24:22