Teste o nome do módulo no sys.modulesdicioná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 importdeclaraçã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.modulestesta se a etapa 1 ocorreu. O teste para o resultado da etapa 2 requer saber qual importinstruçã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.nestedmoduleconjuntos 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 nestedmodulenameconjuntos nestedmodulename = sys.modules['packagename.nestedmodulename'](somente quando não havia nenhum objeto nomeado nestedmodulenameno packagenamenamespace 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 altnameconjuntos altname = sys.modules['packagename.nestedmodulename'](somente quando não havia nenhum objeto nomeado nestedmodulenameno packagenamenamespace 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.