¿Cuál es una buena forma de comprobar si un paquete está instalado dentro de un script de Python? Sé que es fácil para el intérprete, pero necesito hacerlo dentro de un guión.
Supongo que podría verificar si hay un directorio en el sistema que se creó durante la instalación, pero siento que hay una mejor manera. Estoy tratando de asegurarme de que el paquete Skype4Py esté instalado y, si no, lo instalaré.
Mis ideas para realizar el chequeo
- busque un directorio en la ruta de instalación típica
- intente importar el paquete y si se lanza una excepción, instale el paquete
python
package
skype
python-import
Kevin
fuente
fuente
Respuestas:
Si te refieres a un script de Python, simplemente haz algo como esto:
Python 3.3+ usa sys.modules y find_spec :
Python 3:
Python 2:
fuente
Respuesta actualizada
Una mejor forma de hacer esto es:
El resultado:
Compruebe si
requests
está instalado:¿Por qué de esta manera? A veces tienes colisiones de nombres de aplicaciones. Importar desde el espacio de nombres de la aplicación no le brinda una imagen completa de lo que está instalado en el sistema.
Tenga en cuenta que la solución propuesta funciona:
pip install http://some.site/package-name.zip
o cualquier otro tipo de archivo).python setup.py install
.sudo apt install python-requests
.Casos en los que podría no funcionar:
python setup.py develop
.pip install -e /path/to/package/source/
.Respuesta antigua
Una mejor forma de hacer esto es:
Para pip> = 10.x use:
¿Por qué de esta manera? A veces tienes colisiones de nombres de aplicaciones. Importar desde el espacio de nombres de la aplicación no le brinda una imagen completa de lo que está instalado en el sistema.
Como resultado, obtienes una lista de
pkg_resources.Distribution
objetos. Vea lo siguiente como ejemplo:Haz una lista:
Compruebe si
requests
está instalado:fuente
import json
está funcionando). El método de ice.nicer está funcionando en este caso.if "u'requests'" in installed_packages:
de Respuesta actualizada para que funcionara para mí. La salida deprint()
produce esto en mi macOS python:[..., u'pytz', u'requests', ...]
if "requests'"
(observe la comilla simple al final). no tiene ningún sentido.pip
. Por ejemplo, puede crear e instalar un paquete desde la fuente. Esta respuesta no los encontrará. La respuesta de @ ice.nicerfind_spec()
es correcta.A partir de Python 3.3, puede usar el método find_spec ()
fuente
importlib.util.find_spec('google-cloud-logging')
no encuentra nada mientrasimportlib.util.find_spec('google.cloud.logging')
se encuentra. El nombre oficial y el nombre que muestra pip es con guiones, no con puntos. Puede resultar confuso, por lo tanto, utilícelo con precaución.Si desea tener el cheque desde la terminal, puede ejecutar
y si no se devuelve nada, el paquete no está instalado.
Si quizás desea automatizar esta verificación, de modo que, por ejemplo, pueda instalarlo si falta, puede tener lo siguiente en su script bash:
fuente
if
if pip3 show package_name 1>/dev/null; then ...
Como una extensión de esta respuesta :
Para Python 2. *,
pip show <package_name>
realizará la misma tarea.Por ejemplo
pip show numpy
, devolverá lo siguiente o similar:fuente
Puede utilizar el módulo pkg_resources de setuptools. Por ejemplo:
Tenga en cuenta que existe una diferencia entre el módulo de Python y un paquete de Python. Un paquete puede contener varios módulos y es posible que los nombres de los módulos no coincidan con el nombre del paquete.
fuente
Abra su tipo de símbolo del sistema
fuente
Me gustaría agregar algunos pensamientos / hallazgos míos a este tema. Estoy escribiendo un script que verifica todos los requisitos para un programa personalizado. También hay muchas comprobaciones con los módulos de Python.
Hay un pequeño problema con el
solución. En mi caso
python-nmap
, se llamó a uno de los módulos de Python , pero lo importas conimport nmap
y cuando ves que los nombres no coinciden. Por lo tanto, la prueba con la solución anterior devuelve un resultado falso, y también importa el módulo en el momento del impacto, pero tal vez no sea necesario utilizar mucha memoria para una prueba / verificación simple.Tambien encontre que
installed_packages
solo tendrá los paquetes que se hayan instalado con pip . En mi sistema,pip freeze
devuelve los40
módulos de Python, mientras queinstalled_packages
solo tiene1
el que instalé manualmente (python-nmap).Otra solución a continuación que sé que puede no ser relevante para la pregunta , pero creo que es una buena práctica mantener la función de prueba separada de la que realiza la instalación, podría ser útil para algunos.
La solución que funcionó para mí. Se basa en esta respuesta Cómo verificar si existe un módulo de Python sin importarlo
NOTA: esta solución no puede encontrar el módulo por el nombre
python-nmap
también, tengo que usarlonmap
en su lugar (fácil de vivir) pero en este caso el módulo no se cargará en la memoria en absoluto.fuente
Si desea que su script instale los paquetes que faltan y continúe, puede hacer algo como esto (en el ejemplo del módulo 'krbV' en el paquete 'python-krbV'):
fuente
Una forma rápida es usar la herramienta de línea de comandos de Python . Simplemente escriba
import <your module name>
. Verá un error si falta el módulo.fuente
Hmmm ... lo más cercano que vi a una respuesta conveniente fue usar la línea de comando para probar la importación. Pero prefiero incluso evitar eso.
¿Qué tal 'pip freeze | grep pkgname '? Lo probé y funciona bien. También te muestra la versión que tiene y si está instalada bajo control de versiones (instalar) o editable (desarrollar).
fuente
clase myError (excepción): pase # o haga algo intente: importar mymodule excepto ImportError como e: raise myError ("se produjo un error")
fuente
En el tipo de Terminal
Ejemplo
fuente
Me gustaría comentar la respuesta de @ ice.nicer pero no puedo, así que ... Mis observaciones son que los paquetes con guiones se guardan con guiones bajos, no solo con puntos como lo señala el comentario de @dwich
Por ejemplo, lo hace
pip3 install sphinx-rtd-theme
, pero:importlib.util.find_spec(sphinx_rtd_theme)
devuelve un objetoimportlib.util.find_spec(sphinx-rtd-theme)
devuelve Ningunoimportlib.util.find_spec(sphinx.rtd.theme)
genera ModuleNotFoundErrorAdemás, algunos nombres están totalmente cambiados. Por ejemplo, lo hace,
pip3 install pyyaml
pero se guarda simplemente comoyaml
Estoy usando python3.8
fuente
fuente
Vaya a la opción # 2. Si
ImportError
se lanza, el paquete no está instalado (o no está incluidosys.path
).fuente