Prueba el nombre del módulo en el sys.modules
diccionario :
import sys
modulename = 'datetime'
if modulename not in sys.modules:
print 'You have not imported the {} module'.format(modulename)
De la documentación:
Este es un diccionario que asigna nombres de módulos a módulos que ya se han cargado.
Tenga en cuenta que una import
declaración hace dos cosas:
- si el módulo nunca se ha importado antes (== no está presente en
sys.modules
), entonces se carga y se agrega sys.modules
.
- Enlaza 1 o más nombres en el espacio de nombres actual que hacen referencia al objeto del módulo o a objetos que son miembros del espacio de nombres del módulo.
La expresión modulename not in sys.modules
comprueba si se ha realizado el paso 1. La prueba del resultado del paso 2 requiere saber qué import
declaración exacta se usó, ya que establecen diferentes nombres para hacer referencia a diferentes objetos:
import modulename
conjuntos modulename = sys.modules['modulename']
import packagename.nestedmodule
conjuntos packagename = sys.modules['packagename']
(no importa cuántos niveles adicionales agregue)
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']
(solo cuando no había ningún objeto nombrado nestedmodulename
en el packagename
espacio de nombres antes de esta importación, se agrega un nombre adicional para el módulo anidado al espacio de nombres del paquete principal en este punto)
from somemodule import objectname as altname
conjuntos altname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
conjuntos altname = sys.modules['packagename.nestedmodulename']
(solo cuando no había ningún objeto nombrado nestedmodulename
en el packagename
espacio de nombres antes de esta importación, se agrega un nombre adicional para el módulo anidado al espacio de nombres del paquete principal en este punto)
Puede probar si el nombre al que estaba vinculado el objeto importado existe en un espacio de nombres determinado:
'importedname' in dir()
'importedname' in globals()
'importedname' in globals(sys.modules['somemodule'])
Esto solo le indica que el nombre existe (se ha vinculado), no si se refiere a un módulo u objeto específico de ese módulo. Puede realizar una introspección adicional de ese objeto o probar si es el mismo objeto que el que está disponible en sys.modules
, si necesita descartar que el nombre se haya establecido en algo completamente diferente desde entonces.
raise SystemError()
(u otra excepción de su elección) en la parte superior del módulo que no desea importar. Si no realmente importa en algún lugar, su programa arrojará un rastreo y salida.