Pregunta

¿Qué es una buena forma de comprobar si un paquete está instalado, mientras que dentro de una secuencia de comandos de Python?Sé que es fácil desde el intérprete, pero necesito hacerlo dentro de un script.

Supongo que podría comprobar si existe un directorio en el sistema que se crea durante la instalación, pero me siento como que hay una mejor manera.Estoy tratando de asegurarse de que el Skype4Py paquete está instalado, y si no voy a instalarlo.

Mis ideas para llevar a cabo la verificación

  • echa un directorio en la típica ruta de instalación
  • tratar de importar el paquete y si una excepción es el tiro, luego de instalar el paquete
¿Fue útil?

Solución

Si te refieres a un script de Python, solo haz algo como esto:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.

Otros consejos

Respuesta actualizada

Una mejor manera de hacerlo es:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

El resultado:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

Verifique si requests está instalado:

if 'requests' in installed_packages:
    # Do something

¿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.

Respuesta anterior

Una mejor manera de hacerlo es:

import pip
installed_packages = pip.get_installed_distributions()

Para pip > = 10.x use:

from pip._internal.utils.misc import get_installed_distributions

¿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:

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

Haga una lista:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

Verifique si <=> está instalado:

if 'requests' in flat_installed_packages:
    # Do something

A partir de Python 3.3, puede utilizar find_spec () método

import importlib.util
import sys

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")

Si desea recibir el cheque desde la terminal, puede ejecutar

pip3 show package_name

y si no se devuelve nada, el paquete no está instalado.

Si quizás desea automatizar esta comprobación, de modo que, por ejemplo, pueda instalarla si falta, puede tener lo siguiente en su script bash:

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi

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 lo mismo:

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires: 
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy

Puede usar el módulo pkg_resources desde setuptools. Por ejemplo:

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

Tenga en cuenta que hay una diferencia entre el módulo de Python y un paquete de Python. Un paquete puede contener varios módulos y los nombres de los módulos pueden no coincidir con el nombre del paquete.

Me gustaría añadir algunas reflexiones/conclusiones de la mina para este tema.Estoy escribiendo un script que comprueba todos los requisitos para un programa hecho a medida.Hay muchas pruebas con los módulos de python demasiado.

Hay un pequeño problema con el

try:
   import ..
except:
   ..

solución.En mi caso uno de los módulos de python llamado python-nmap, pero la importación con import nmap y como se puede ver los nombres de desajuste.Por lo tanto, la prueba con la solución anterior devuelve un resultado Falso, y también importa el módulo sobre el éxito, pero tal vez no hay necesidad de utilizar una gran cantidad de memoria para una simple prueba/verificación.

También me pareció que

import pip
installed_packages = pip.get_installed_distributions()

installed_packages se han sólo los paquetes que ha sido instalado con pip.En mi sistema pip freeze devuelve más de 40 los módulos de python, mientras que installed_packages sólo tiene 1, de la que me he instalado manualmente (python-nmap).

Otra solución por debajo de lo que yo se puede que no sea relevante para la pregunta, pero creo que es una buena práctica mantener la función de prueba independiente desde el que realiza la instalación podría ser útil para algunos.

La solución que funcionó para mí.Basándose en esta respuesta Cómo comprobar si un módulo de python existe, sin importar que

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

NOTA:esta solución no se puede encontrar el módulo por el nombre python-nmap también, tengo que usar nmap lugar (es fácil vivir con), pero en este caso el módulo no será cargado a la memoria alguna.

Si desea que su script instale paquetes faltantes y continúe, puede hacer algo como esto (en el ejemplo del módulo 'krbV' en el paquete 'python-krbV'):

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))

Una forma rápida es utilizar la herramienta de línea de comando python . Simplemente escriba import <your module name> Verá un error si falta el módulo.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$

Ir a la opción # 2. Si se arroja ImportError, entonces el paquete no está instalado (o no está en sys.path).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top