Necesito saber si existe un módulo de Python, sin importarlo.
Importar algo que podría no existir (no es lo que quiero):
try:
import eggs
except ImportError:
pass
python
python-import
yarbelk
fuente
fuente
Respuestas:
Python2
Para verificar si la importación puede encontrar algo en python2, usando
imp
Para encontrar importaciones punteadas, debe hacer más:
También puede usar
pkgutil.find_loader
(más o menos lo mismo que la parte python3Python3
Python3 ≤ 3.3
Deberías usar
importlib
, Cómo hice esto fue:Mi expectativa es que si puedes encontrar un cargador para él, entonces existe. También puede ser un poco más inteligente al respecto, como filtrar los cargadores que aceptará. Por ejemplo:
Python3 ≥ 3.4
En Python3.4, los
importlib.find_loader
documentos de Python quedaron en desuso a favor deimportlib.util.find_spec
. El método recomendado es elimportlib.util.find_spec
. Hay otros comoimportlib.machinery.FileFinder
, lo que es útil si buscas un archivo específico para cargar. Descubrir cómo usarlos está más allá del alcance de esto.Esto también funciona con importaciones relativas, pero debe proporcionar el paquete inicial, por lo que también podría hacer:
Si bien estoy seguro de que existe una razón para hacerlo, no estoy seguro de cuál sería.
ADVERTENCIA
¡Al intentar encontrar un submódulo, importará el módulo principal (para todos los métodos anteriores)!
comentarios bienvenidos para evitar esto
Agradecimientos
find_loader
fuente
eggs.ham.spam
.spam
eneggs.ham
tiimp.find_module('spam', ['eggs', 'ham'])
imp
está en desuso a favor deimportlib
Python 3.pkgutil.find_loader("my.package.module")
devuelve un cargador si el paquete / módulo existe yNone
si no. Actualice su respuesta para Python 2, ya que enmascarar el ImportError me volvió loco ayer xPDespués de usar la respuesta de yarbelk, hice esto para no tener que importar
ìmp
.Útil en Django
settings.py
por ejemplo.fuente
Python 3> = 3.6: ModuleNotFoundError
Se
ModuleNotFoundError
ha introducido en Python 3.6 y se puede utilizar para este propósito.El error se genera cuando no se puede encontrar un módulo o uno de sus padres . Entonces
imprimiría un mensaje que se vería
No module named 'eggs'
si eleggs
módulo no se puede encontrar; pero imprimiría algo comoNo module named 'eggs.sub'
sisub
no se pudiera encontrar el módulo pero se pudiera encontrar eleggs
paquete.Consulte la documentación del sistema de importación para obtener más información sobre
ModuleNotFoundError
fuente
Python 2, sin depender de ImportError
Hasta que se actualice la respuesta actual, este es el camino para Python 2
¿Por qué otra respuesta?
Muchas respuestas hacen uso de la captura de un
ImportError
. El problema con eso es que no podemos saber qué arroja elImportError
.Si importa su loro módulo y sucede que hay una
ImportError
en el módulo (por ejemplo, error tipográfico en la línea 1), el resultado será que el módulo no existe. Le llevará bastante retroceso descubrir que su módulo existe y queImportError
está atrapado y hace que las cosas fallen silenciosamente.fuente
ImportError
; edite si no le quedó claro.La respuesta de go_as como un trazador de líneas
fuente
Me encontré con esta pregunta mientras buscaba una forma de verificar si un módulo está cargado desde la línea de comandos y me gustaría compartir mis pensamientos sobre los que vienen después de mí y buscan lo mismo:
Método de archivo de script Linux / UNIX : cree un archivo
module_help.py
:Luego asegúrese de que sea ejecutable:
chmod u+x module_help.py
Y llámalo con un
pipe
paragrep
:Método interactivo : en la carga de la consola
python
Si se encuentra, deje de leer escribiendo
q
Para salir de la sesión interactiva de Python, presione Ctrl+D
El método de archivo de script de Windows también es compatible con Linux / UNIX, y mejor en general :
Llamándolo desde el comando como:
Daría salida:
y tendrías que presionar
q
para salir del modo interactivo.Utilizándolo módulo desconocido:
Daría salida:
y salir
fuente
Utilice una de las funciones de pkgutil , por ejemplo:
fuente
Una declaración if más simple de AskUbuntu: ¿Cómo verifico si un módulo está instalado en Python?
fuente
Puede escribir un pequeño script que intente importar todos los módulos y decirle cuáles fallan y cuáles funcionan:
Salida:
Una advertencia: esto intentará importar todo para que veas cosas como
PyYAML failed with error code: No module named pyyaml
porque el nombre de importación real es solo yaml. Entonces, siempre que conozca sus importaciones, esto debería ser el truco para usted.fuente
Escribí esta función auxiliar:
fuente
También puedes usar
importlib
directamentefuente
No hay forma de verificar de manera confiable si el "módulo de puntos" es importable sin importar su paquete principal. Dicho esto, hay muchas soluciones al problema "cómo verificar si existe el módulo Python".
La solución a continuación soluciona el problema de que el módulo importado puede generar ImportError incluso si existe. Queremos distinguir esa situación de aquella en la que el módulo no existe.
Python 2 :
Python 3 :
fuente
en django.utils.module_loading.module_has_submodule
fuente