¿Cómo verifico si importé un módulo en algún lugar del código?
if not has_imported("somemodule"):
print('you have not imported somemodule')
La razón por la que me gustaría comprobar si ya importé un módulo es porque tengo un módulo que no quiero importar porque a veces estropea mi programa.
python
python-import
Yuval
fuente
fuente
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.Respuestas:
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:
Tenga en cuenta que una
import
declaración hace dos cosas:sys.modules
), entonces se carga y se agregasys.modules
.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
conjuntosmodulename = sys.modules['modulename']
import packagename.nestedmodule
conjuntospackagename = sys.modules['packagename']
(no importa cuántos niveles adicionales agregue)import modulename as altname
conjuntosaltname = sys.module['modulename']
import packagename.nestedmodule as altname
conjuntosaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
conjuntosobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
conjuntosnestedmodulename = sys.modules['packagename.nestedmodulename']
(solo cuando no había ningún objeto nombradonestedmodulename
en elpackagename
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
conjuntosaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
conjuntosaltname = sys.modules['packagename.nestedmodulename']
(solo cuando no había ningún objeto nombradonestedmodulename
en elpackagename
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:
# is this name visible in the current scope: 'importedname' in dir() # or, is this a name in the globals of the current module: 'importedname' in globals() # or, does the name exist in the namespace of another module: '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.fuente
numpy
paquete: ¿usarimport sys
dentro de la función es lo mejor para verificar que se ha importado? Por "mejor" me refiero en términos del impacto en el rendimiento, comoimport sys
se llamará cada vez que se llame a la función. Graciasimport sys
es que sea caro de ninguna manera;sys
siempre existe, por defecto ya está cargado. Pero para un paquete opcional: simplemente importe el paquete . Detecte laImportError
excepción si el paquete no está instalado y establezca una marca que indique que está instalado cuando la importación se realice correctamente. Después de eso, puede usar la bandera para informar su uso de la dependencia opcional.name in sys.modules
prueba solo es útil si no desea importar .A las respuestas de sys.modules aceptadas, agregaría una advertencia para tener cuidado al cambiar el nombre de los módulos en la importación:
>>> import sys >>> import datetime as dt >>> 'dt' in sys.modules False >>> 'datetime' in sys.modules True
fuente
use sys.modules para probar si se ha importado un módulo (estoy usando unicodedata como ejemplo):
>>> import sys >>> 'unicodedata' in sys.modules False >>> import unicodedata >>> 'unicodedata' in sys.modules True
fuente
sys.modules
contiene todos los módulos utilizados en cualquier lugar de la instancia actual del intérprete y, por lo tanto, aparece si se importa en cualquier otro módulo de Python.dir()
comprueba si el nombre se definió en el espacio de nombres actual.La combinación de los 2 es más segura que cada uno por separado y funciona siempre que no lo hayas definido
copy
tú mismo.if ('copy' in sys.modules) and ('copy' in dir()):
fuente
if "sys" not in dir(): print("sys not imported!")
fuente
sys
puede ser cualquier cosa, no solo un módulo.