2010-12-29 15 views
70

Per quanto ne so, Python ha 3 modi di scoprire ciò che il sistema operativo è in esecuzione su:Quando utilizzare os.name, sys.platform o platform.system?

  1. os.name
  2. sys.platform
  3. platform.system()

Conoscere queste informazioni è spesso utile in importazioni condizionali o utilizzo di funzionalità diverse da piattaforme (ad esempio time.clock() su Windows vs time.time() su UNIX).

La mia domanda è, perché 3 diversi modi di farlo? Quando dovrebbe essere usato un modo e non un altro? In che modo è il "migliore" (la maggior parte a prova di futuro o meno probabilità di escludere accidentalmente un particolare sistema su cui il tuo programma può effettivamente essere eseguito)?

Sembra sys.platform è più specifico di os.name, che consente di distinguere win32 da cygwin (piuttosto che semplicemente nt), e linux2 da darwin (piuttosto che semplicemente posix). Ma se è così, che dire della differenza tra sys.platform e platform.system()?

Per esempio, che è meglio, questo:

import sys 
if sys.platform == 'linux2': 
    # Do Linux-specific stuff 

o del presente? :

import platform 
if platform.system() == 'Linux': 
    # Do Linux-specific stuff 

Per ora sarò attenersi ad sys.platform, quindi questa domanda non è particolarmente urgente, ma sarei molto grato per alcuni chiarimenti riguardo a questa.

+11

uso 'sys.platform.startswith ('linux') al posto di' sys.platform == 'linux2'' 'per la futura compatibilità – jfs

risposta

2

Credo che il modulo di piattaforma sia probabilmente preferito per il nuovo codice. Gli altri esistevano prima di esso. È un'evoluzione, e gli altri rimangono per compatibilità all'indietro.

+6

mi chiedo se siamo in grado di ottenere qualsiasi sviluppatori Python per confermare questo. Forse anche chiunque abbia sviluppato il modulo della piattaforma. – ztangent

8

Da sys.platform docs:

  • os.name ha una granularità grossolana
  • os.uname() dà dipendente dal sistema le informazioni sulla versione
  • Il modulo platform fornisce controlli dettagliati per l'identità del sistema di

Spesso il " il miglior modo "a prova di futuro per verificare se alcune funzionalità sono disponibili è solo per t ry per usarlo e usare un fallback se fallisce.

E la differenza tra sys.platform e platform.system()?

platform.system() restituisce un valore normalizzato che si potrebbe ottenere da diverse fonti: os.uname(), sys.platform, ver di comando (su Windows).

49

Immerso un po 'nel codice sorgente.

Le uscite di sys.platform e os.name sono determinate al momento della compilazione. platform.system() determina il tipo di sistema in fase di esecuzione.

  • sys.platform viene specificato come definizione del compilatore durante la configurazione di compilazione.
  • os.name verifica se moduli specifici certa os disponibili (ad esempio posix, nt, ...)
  • platform.system() effettivamente corre uname e potenzialmente diverse altre funzioni per determinare il tipo di sistema in fase di esecuzione.

Il mio suggerimento, utilizzare os.name per verificare se si tratta di un sistema POSIX-compliant, utilizzare sys.platform per verificare se si tratta di un Linux, Cygwin, Darwin, atheos, qualunque sia, e utilizzare platform.system(), bene, se non credono le altre fonti.

18

C'è una sottile differenza linea tra platform.system() e sys.platform ed è interessante per la maggior parte dei casi platform.system() degenera al sys.platform

Ecco quale sia la fonte Python2.7\Lib\Platform.py\system dice

def system(): 

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

     An empty string is returned if the value cannot be determined. 

    """ 
    return uname()[0] 

def uname(): 
    # Get some infos from the builtin os.uname API... 
    try: 
     system,node,release,version,machine = os.uname() 
    except AttributeError: 
     no_os_uname = 1 

    if no_os_uname or not filter(None, (system, node, release, version, machine)): 
     # Hmm, no there is either no uname or uname has returned 
     #'unknowns'... we'll have to poke around the system then. 
     if no_os_uname: 
      system = sys.platform 
      release = '' 
      version = '' 
      node = _node() 
      machine = '' 

anche per il documentation

os.uname()

Restituisce una 5-tupla contenente informazioni che identificano il sistema operativo corrente. La tupla contiene 5 stringhe: (sysname, nomenodo, versione , versione, macchina). Alcuni sistemi troncano il nomenodo su 8 caratteri o sul componente principale; un modo migliore per ottenere il nome host è socket.gethostname() o anche socket.gethostbyaddr (socket.gethostname()).

Availability: recent flavors of Unix. 
7

Dipende se si preferisce sollevare eccezioni o cercando qualcosa su un sistema testato e se il codice è così alto livello o così basso livello che si può o non può funzionare su un sistema non testati simile (es. Mac non testato - 'posix' o su sistemi ARM incorporati). Più pythonic è non enumerare tutti i sistemi noti, ma per testare possibili proprietà rilevanti. (Ad esempio si ritiene importante l'endianess del sistema, ma proprietà multiprocessori non importanti.)

  • os.name è una risoluzione sufficiente per il corretto utilizzo del modulo os. I valori possibili sono "posix", "nt", "os2", "ce" o "riscos", dove probabilmente solo i primi due sono per lo più importanti.

  • sys.platform è una risoluzione più fine. Si consiglia di utilizzare l'idioma if sys.platform.startswith('linux') perché "linux2" indica una versione del kernel Linux 2.xx o 3. I kernel meno recenti non vengono mai utilizzati. In Python 3.3 tutti i sistemi Linux sono semplici 'linux'.

Non conosco le specifiche dei sistemi "Mac" e "Java" e quindi non posso utilizzare i risultati della piattaforma di metodo molto buona.system() per la ramificazione, ma vorrei usare i vantaggi del modulo platform per i messaggi e la registrazione degli errori.

Problemi correlati