Importazione condizionale di moduli in Python


140

Nel mio programma voglio importare simplejson o json in base al fatto che il sistema operativo in cui si trova l'utente sia Windows o Linux. Prendo il nome del sistema operativo come input dall'utente. Ora, è corretto fare quanto segue?

osys = raw_input("Press w for windows,l for linux")
if (osys == "w"):
    import json as simplejson
else:
    import simplejson  

33
Perché stai prendendo il nome del sistema operativo come input dall'utente? Guarda nel modulo della piattaforma. docs.python.org/library/platform.html platform.platform() o platform.system()dovrebbe fare ciò di cui hai bisogno, piuttosto che avere un utente deve inserire qualcosa ogni volta che il codice viene eseguito.
Joe Kington,

56
@ S.Lott: sul serio? Sai che i voti positivi / negativi sono pensati per riflettere la qualità della domanda , giusto? E non se sei d'accordo con qualcos'altro nel codice del PO.
jalf

2
@jalf: è una cattiva domanda in tutti i modi tranne la grammatica. Non dovrebbe essere trovato come la migliore risposta a qualsiasi tipo di ricerca.
S.Lott

11
@ S. Lott non c'è nulla di sbagliato nel voler sapere se le importazioni condizionali sono pitoniche. E ovviamente altri sono d'accordo dato che ha +50 voti in più nonostante i tuoi sforzi.
SARose,

5
+1 per il concetto che stavo cercando (importare solo se si utilizza Win); e un altro +1 concettuale per compensare il ridicolo voto negativo.
S3DEV,

Risposte:


182

Ho visto questo idioma usato molto, quindi non devi nemmeno fare l'annusamento del sistema operativo:

try:
    import json
except ImportError:
    import simplejson as json

17
Dovresti prima provare a importare simplejson as jsonpoiché è probabilmente una versione più recente (più veloce) del jsonmodulo standard .
Seppo Erviälä,

o ujsonper velocità
lababidi

59

Per rispondere alla domanda nel titolo, ma non nel caso specifico fornito, è perfettamente corretto, tonnellate di pacchetti lo fanno. Probabilmente è meglio capire da soli il sistema operativo invece di fare affidamento sull'utente; ecco pySerial che lo fa come esempio.

serial/__init__.py

import sys

if sys.platform == 'cli':
    from serial.serialcli import Serial
else:
    import os
    # chose an implementation, depending on os
    if os.name == 'nt':  # sys.platform == 'win32':
        from serial.serialwin32 import Serial
    elif os.name == 'posix':
        from serial.serialposix import Serial, PosixPollSerial, VTIMESerial  # noqa
    elif os.name == 'java':
        from serial.serialjava import Serial
    else:
        raise ImportError(
            "Sorry: no implementation for your platform ('{}') available".format(
                os.name
            )
        )

Questo dovrebbe essere usato solo nei casi in cui stai assumendo e hai bisogno di una forte garanzia che determinate interfacce / funzionalità saranno presenti: ad esempio un 'file' chiamato /dev/ttyX. Nel tuo caso: avere a che fare con JSON, non c'è nulla che sia effettivamente specifico del sistema operativo e stai solo verificando se il pacchetto esiste o no. In tal caso, solo tryper importarlo e ripiegare con un exceptse fallisce:

try:
    import some_specific_json_module as json
except ImportError:
    import json

11
No, è molto errato codificare i nomi dei sistemi operativi per decidere se simplejsono jsonè disponibile. Stai citando il codice da importazioni intrinsecamente specifiche del sistema operativo , che è un caso molto diverso. Vedi la risposta di Matt per l'approccio corretto.
Glenn Maynard,

16
@Glenn Maynard: allora mi rimanderei; Non ho mai usato il jsonpacchetto e stavo cercando di rispondere alla più generale domanda "puoi fare importazioni condizionali di moduli".
Nick T,

7

Non è consigliabile utilizzare per associare json o simplejson con la piattaforma del sistema operativo. simplejson è la versione più recente e avanzata di json, quindi dovremmo provare a importarlo prima.

Sulla base della versione di Python puoi provare qui sotto per importare json o simplejson

import sys
if sys.version_info > (2, 7):
    import simplejson as json
else:
    import json
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.