Verifica il nome del modulo nel sys.modules
dizionario :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
Dalla documenazione:
Questo è un dizionario che mappa i nomi dei moduli su moduli che sono già stati caricati.
Nota che import
un'istruzione fa due cose:
- se il modulo non è mai stato importato prima (== non presente in
sys.modules
), allora viene caricato e aggiunto a sys.modules
.
- Associa uno o più nomi nello spazio dei nomi corrente che fanno riferimento all'oggetto del modulo o agli oggetti che sono membri dello spazio dei nomi del modulo.
L'espressione modulename not in sys.modules
verifica se il passaggio 1 è stato eseguito. Il test per il risultato del passaggio 2 richiede la conoscenza di quale import
dichiarazione esatta è stata utilizzata poiché impostano nomi diversi per fare riferimento a oggetti diversi:
import modulename
imposta modulename = sys.modules['modulename']
import packagename.nestedmodule
set packagename = sys.modules['packagename']
(non importa quanti livelli aggiuntivi aggiungi)
import modulename as altname
imposta altname = sys.module['modulename']
import packagename.nestedmodule as altname
imposta altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
imposta objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
set nestedmodulename = sys.modules['packagename.nestedmodulename']
(solo quando non c'era alcun oggetto denominato nestedmodulename
nello packagename
spazio dei nomi prima di questa importazione, un nome aggiuntivo per il modulo nidificato viene aggiunto allo spazio dei nomi del pacchetto padre a questo punto)
from somemodule import objectname as altname
imposta altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
set altname = sys.modules['packagename.nestedmodulename']
(solo quando non c'era alcun oggetto denominato nestedmodulename
nello packagename
spazio dei nomi prima di questa importazione, un nome aggiuntivo per il modulo nidificato viene aggiunto allo spazio dei nomi del pacchetto padre a questo punto)
Puoi verificare se il nome a cui era associato l'oggetto importato esiste in un determinato spazio dei nomi:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Questo ti dice solo che il nome esiste (è stato associato), non se si riferisce a un modulo o oggetto specifico da quel modulo. Potresti esaminare ulteriormente quell'oggetto o verificare se è lo stesso oggetto di quello che è disponibile in sys.modules
, se devi escludere che il nome sia stato impostato su qualcos'altro da allora.
raise SystemError()
Metti semplicemente (o un'altra eccezione a tua scelta) nella parte superiore del modulo che non vuoi importare. Se lo importi effettivamente da qualche parte, il tuo programma lancerà un traceback ed uscirà.