Teste o nome do módulo no sys.modules
dicionário :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
Da documentação:
Este é um dicionário que mapeia nomes de módulos para módulos que já foram carregados.
Observe que uma import
declaração faz duas coisas:
- se o módulo nunca foi importado antes (== não está presente em
sys.modules
), ele é carregado e adicionado sys.modules
.
- Vincule 1 ou mais nomes no namespace atual que fazem referência ao objeto do módulo ou a objetos que são membros do namespace do módulo.
A expressão modulename not in sys.modules
testa se a etapa 1 ocorreu. O teste para o resultado da etapa 2 requer saber qual import
instrução exata foi usada, pois eles definem nomes diferentes para fazer referência a objetos diferentes:
import modulename
conjuntos modulename = sys.modules['modulename']
import packagename.nestedmodule
conjuntos packagename = sys.modules['packagename']
(não importa quantos níveis adicionais você adicionar)
import modulename as altname
conjuntos altname = sys.module['modulename']
import packagename.nestedmodule as altname
conjuntos altname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
conjuntos objectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
conjuntos nestedmodulename = sys.modules['packagename.nestedmodulename']
(somente quando não havia nenhum objeto nomeado nestedmodulename
no packagename
namespace antes desta importação, um nome adicional para o módulo aninhado é adicionado ao namespace do pacote pai neste ponto)
from somemodule import objectname as altname
conjuntos altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
conjuntos altname = sys.modules['packagename.nestedmodulename']
(somente quando não havia nenhum objeto nomeado nestedmodulename
no packagename
namespace antes desta importação, um nome adicional para o módulo aninhado é adicionado ao namespace do pacote pai neste ponto)
Você pode testar se o nome ao qual o objeto importado foi associado existe em um determinado namespace:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Isso apenas informa se o nome existe (foi vinculado), não se ele se refere a um módulo ou objeto específico desse módulo. Você pode examinar mais profundamente esse objeto ou testar se é o mesmo objeto que está disponível sys.modules
, se precisar descartar que o nome foi definido como algo totalmente diferente desde então.
raise SystemError()
(ou outra exceção de sua escolha) no topo do módulo que você não deseja importar. Se você não realmente importá-lo em algum lugar, seu programa irá lançar um rastreamento e sair.