Verifica il nome del modulo nel sys.modulesdizionario :
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 importun'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.modulesverifica se il passaggio 1 è stato eseguito. Il test per il risultato del passaggio 2 richiede la conoscenza di quale importdichiarazione esatta è stata utilizzata poiché impostano nomi diversi per fare riferimento a oggetti diversi:
import modulename imposta modulename = sys.modules['modulename']
import packagename.nestedmoduleset 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 nestedmodulenameset nestedmodulename = sys.modules['packagename.nestedmodulename'](solo quando non c'era alcun oggetto denominato nestedmodulenamenello packagenamespazio 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 altnameset altname = sys.modules['packagename.nestedmodulename'](solo quando non c'era alcun oggetto denominato nestedmodulenamenello packagenamespazio 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à.