2015-05-27 4 views
21

Come posso verificare se ho importato un modulo da qualche parte nel codice?Come verificare se un modulo python è stato importato?

if not has_imported("sys"): 
    print 'you have not imported sys' 

La ragione per cui vorrei controllare se ho già importato un modulo è perché ho un modulo che non voglio importare perché a volte si scombina il mio programma.

+0

Basta mettere 'alzare SystemError()' (o altra eccezione a tua scelta) nella parte superiore del modulo che non desideri importare. Se * lo fai * effettivamente lo importa da qualche parte, il tuo programma genererà un traceback e uscirà. – larsks

+0

In che modo l'importazione di un modulo compromette comunque il programma? Non sembra così probabile. –

+1

@BillWoodger: forse quel modulo [cambia lo stato globale che non vuoi cambiare] (https://stackoverflow.com/questions/23918716/reloading-a-module-gives-functionality-that-isnt-originally-available-by -import/23918750 # 23918750). –

risposta

31

prova per il nome del modulo nella sys.modules dictionary:

import sys 

modulename = 'datetime' 
if modulename not in sys.modules: 
    print 'You have not imported the {} module'.format(modulename) 

Dal documenation:

Questo è un dizionario che mappa i nomi dei moduli per moduli che sono già stati caricati.

+0

Come può essere utilizzato per altri moduli, tutto il modulo ha datetime – The6thSense

+3

@VigneshKalai: quella frase non viene analizzata, mi dispiace. 'sys.modules' contiene tutti i moduli usati * ovunque nell'istanza corrente dell'interprete *. Se 'datetime' è usato * in qualsiasi altro modulo Python * verrà mostrato lì. –

+0

@VigneshKalai ... e datetime era solo un modulo di esempio, lo sostituiresti con il nome del modulo che temi. –

8

uso sys.modules per testare se un modulo è stato importato (sto usando unicodedata come esempio):

>>> import sys 
>>> 'unicodedata' in sys.modules 
False 
>>> import unicodedata 
>>> 'unicodedata' in sys.modules 
True 
-1
if "sys" not in dir(): 
    print("sys not imported!") 
+0

Questo controlla solo se il modulo è stato importato nello spazio dei nomi corrente. Anche 'sys' può essere qualsiasi cosa, non solo un modulo. – vaultah