2009-09-07 13 views
40

Sto lavorando su un paio di strumenti Linux e ho bisogno di impedire l'installazione su Windows, poiché dipende da FHS e quindi è reso inutile su quella piattaforma. La funzione platform.platform si chiude ma restituisce solo una stringa.Rileva in modo affidabile Windows in Python

Purtroppo non so cosa cercare in quella stringa perché produca un risultato affidabile. Qualcuno sa cosa cercare o qualcuno sa di un'altra funzione che mi manca qui?

risposta

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

Prova questa:

import platform 

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

Edit: appena visto che si è tentato platform.platform() ... platform.system() funzionerà meglio per questo caso. Fidati di me, usalo. Gli angoli bui si trovano nel rilevamento della piattaforma.

distutils lo faranno anche se lo chiedete gentilmente.

Si può sempre fare qualcosa di male come os.path.exists() su un file di Windows ... ma platform è affidabile come nella libreria standard di Python.

Modifica 2: Un altro utile addetto alla risposta ha rilevato platform.system() esattamente uguale a "Windows" sulla sua macchina Windows.

+1

Anche io non ho Windows a portata di mano, ma questa funzione restituisce 'Linux' sul mio pc. I documenti sembrano menzionare 'Windows', quindi suppongo che ci andrò e spero che copra tutti i casi. – blokkie

+0

Dovrebbe. Vedi la risposta di Pax. –

+0

Ah, le tue modifiche lo hanno cancellato. Molto obbligato. – blokkie

16

Nella casella di Windows, platform.system() restituisce 'Windows'.

Tuttavia, non sono sicuro del motivo per cui dovresti preoccuparti. Se vuoi limitare la piattaforma su cui gira tecnologicamente, utilizzerei una white-list piuttosto che una black-list.

In realtà, io non lo farei tecnologicamente affatto poiché forse la prossima release di Python può avere Win32/Win64 invece di Windows (per il nero-listing) e *nix invece di Linux (per il bianco-listing).

Il mio consiglio è di indicare semplicemente quali sono i requisiti e, se l'utente sceglie di ignorarlo, questo è il loro problema. Se squillano dicendo che hanno ricevuto un messaggio di errore che indica "Impossibile trovare FHS" e ammettono che sono in esecuzione su Windows, indicare gentilmente che non è una configurazione supportata.

Forse i tuoi clienti sono abbastanza intelligenti da far funzionare FHS con Windows in modo che il tuo codice funzioni. È improbabile che apprezzino ciò che considererebbero una limitazione arbitraria del software.

Questo è un problema affrontato dagli sviluppatori di software ogni giorno. Persino le grandi organizzazioni non sono in grado di supportare ogni singola piattaforma e configurazione.

+1

+1, buona risposta e sono d'accordo. Rilevare che FHS non è disponibile è un metodo molto migliore di rilevare il sistema operativo e fare un'ipotesi, ed è più sicuro (dopo tutto, avere qualcuno che hack intorno al limite della propria piattaforma fallirà * comunque *!). –

+0

+1, sì una lista bianca è preferibile in quanto i casi d'angolo sono cattivi. Eseguendo sotto Cygwin su una scatola di Windows ottengo 'platform.system()' restituendo 'CYGWIN_NT-5.2-WOW64'. Non sarebbe stata la mia prima ipotesi! –

2

Da aiuto (piattaforma)

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' 

"Il nome del modulo dipende sistema operativo importati sono attualmente stati registrati i seguenti nomi:. '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

Almeno sulla mia casella 'os.name' restituisce' posix' quando è in esecuzione in Cygwin, e 'nt' quando è in esecuzione in Windows nativo build – sbk

+0

Sì, Cygwin è un problema, ma per la storia originale questo comportamento è accettato (se non desiderato). –

46

Per coloro che è venuto qui in cerca di un modo per rilevare Cygwin da Python (al contrario di rilevare solo Windows), qui ci sono alcuni valori esempio di ritorno da os.name e platform.system su diverse piattaforme

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 

da questo punto, come distinguere tra Windows nativa e Cygwin dovrebbe essere ovvio anche se non sono convinto che questo è a prova di futuro.

* numeri di versione sono per XP e Win7 respecti vely, non fare affidamento su di loro

+3

My Cygwin mostra "Windows". –

+0

@JaceBrowning: abbastanza giusto, probabilmente stiamo usando una versione diversa di Cygwin o Python ... Qui è dove arriva la nota "non-futureproof" :) – sbk

+0

la differenza è probabilmente che la mia installazione Python fa parte di Windows, non attraverso Cygwin? –

Problemi correlati