2010-01-27 20 views
35

Il controllo al solito di distinguere tra l'esecuzione Python-applicazione su Windows e su altri sistemi operativi (Linux in genere) è quello di utilizzare condizionale:È sicuro usare sys.platform == 'win32' controllare su Python 64-bit?

if sys.platform == 'win32': 
    ... 

Ma mi chiedo è sicuro da usare oggi, quando a 64-bit Python è più ampiamente usato negli ultimi anni? 32 significa davvero 32-bit o in pratica si riferisce all'API Win32?

Se c'è la possibilità di avere un giorno sys.platform come 'win64', forse tale condizione sarebbe più universale?

if sys.platform.startswith('win'): 
    ... 

c'è anche un altro modo per rilevare di Windows sono a conoscenza di:

if os.name == 'nt': 
    ... 

Ma ho davvero mai visto in altro codice l'uso di quest'ultimo.

Qual è il modo migliore allora?

UPD: Mi piacerebbe evitare l'uso di librerie aggiuntive, se possibile. Richiedere l'installazione di librerie aggiuntive per verificare che non lavori in Windows potrebbe essere fastidioso per gli utenti Linux.

+1

Questa è una domanda molto buona. Grazie. – jathanism

risposta

29

sys.platform sarà win32 a prescindere dal numero di bit del sistema di Windows sottostante, come si può vedere nel PC/pyconfig.h (dalla distribuzione 2.6 sorgente Python):

#if defined(MS_WIN64) 
/* maintain "win32" sys.platform for backward compatibility of Python code, 
    the Win64 API should be close enough to the Win32 API to make this 
    preferable */ 
#  define PLATFORM "win32" 

E 'possibile trovare il original patch che ha introdotto questo su il web, che offre un po 'più spiegazione:

la domanda principale è: è Win64 molto di più come Win32 di diverso da essa che il comune caso programmatore Python generale non dovrebbe vigilia Devo fare la differenziazione nel suo codice Python. O, almeno, abbastanza in modo che tale differenziazione da parte dello scriptor Python sia abbastanza rara da rendere sufficiente un altro meccanismo (anche preferibile). Attualmente la risposta è sì. Speriamo che la SM non cambierà questa risposta.

+1

Grazie, questo è quello di cui ho bisogno. – bialix

+0

Prego! –

1

Gli avvertimenti per Windows/32 e Windows/64 sono gli stessi, quindi dovrebbero utilizzare lo stesso valore. L'unica differenza potrebbe essere ad es. sys.maxint e ctypes. Se è necessario distinguere tra 32 e 64 indipendentemente dal fatto che lo platform sia la soluzione migliore.

+0

Non ho proprio la risposta. Dici che il build Python a 64 bit usa "win32" in sys.platform? Il vero problema per me è che non ho una macchina a 64 bit in giro per verificare questa ipotesi. – bialix

+0

La build di Windows/64 utilizza 'win32'. (ovviamente gli altri sistemi operativi a 64 bit no) –

3

Personalmente utilizzo platinfo per rilevare la piattaforma sottostante.

>>> from platinfo import PlatInfo 
>>> pi = PlatInfo() 
>>> pi.os 
'win64' 
>>> pi.arch 
'x64' 
>>> pi.name() 
'win64-x64' 

Per 32 bit, pi.name() rendimenti win32-x86.

+2

Preferisco evitare l'uso di dipendenze extra se riesco a ottenere ciò che mi serve da Vanilla Python. – bialix

3

Si noti che non è possibile utilizzare sia sys.platform o os.name per questo su Jython:

$ jython -c "import sys, os; print sys.platform; print os.name" 
java1.6.0_20 
java 

Penso che ci sia un piano in progetto di Jython cambiare os.name per segnalare il sistema operativo sottostante allo stesso modo come CPython, ma perché la gente stanno usando os.name == 'java' per verificare se sono su Jython questo cambiamento non può essere fatto durante la notte. C'è, tuttavia, già os._name su Jython 2.5.x:

$ jython -c "import os; print os._name" 
posix 

Personalmente tendo a usare os.sep == '/' con il codice che deve essere eseguito sia su Jython e CPython, e sia su piattaforme Windows e Unixy. È un po 'brutto ma funziona.

+0

Per IronPython 'sys.platform == 'cli''. – Gabe

Problemi correlati