¿Cómo verifico si un módulo está instalado en Python e instalarlo si es necesario?

89

En la terminal, después de iniciar Python, ¿cómo sabré cuáles son los módulos presentes en python? Supongamos que necesito aprender los módulos NumPy y SciPy.

  • ¿Cómo lo instalaré si no está instalado?
  • ¿Cómo sabré si ya está instalado?
TechJhola
fuente

Respuestas:

73

Cómo saber si un módulo de Python está instalado o no en el sistema: puede hacer una prueba muy fácil en la terminal,

$ python -c "import math"
$ echo $?
0                                # math module exists in system

$ python -c "import numpy"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named numpy
$ echo $?
1                                # numpy module does not exist in system

¿Cómo lo instalaré si no está instalado?

Puede instalar un módulo específico descargando los paquetes respectivos del repositorio, por ejemplo, puede instalarscipy como,

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Alternativamente , también puede instalar un módulo de Python usando python-pipcomo lo sugiere Zack Titan en el comentario a continuación , para instalar numpypuede usar

pip install numpy

Advertencia: Se recomienda encarecidamente instalar los módulos de python utilizando solo el repositorio oficial de Ubuntu y no utilizar el pipmétodo como superusuario (es decir, como rooto usando sudo). En algunos casos, puede dejar su sistema inutilizable al romper el sistema python.

Cómo instalar paquetes usando pipen un entorno virtual local.

souravc
fuente
Al igual que en su respuesta, existe un módulo matemático y, para adormecer, no apareció el rastreo y para echo $? salida fue 0, ¿Significa que numpy también está presente en mi sistema?
TechJhola
1
Sí, está ahí en su sistema.
souravc
En caso de que no tenga el módulo numpy, ¿cómo lo importará? Cuando hacemos la codificación, llamamos a la declaración de importación desde numpy import *, ¿instalará el módulo? Si no, ¿cómo instalaremos un nuevo módulo?
TechJhola
1
Será una pregunta separada cómo instalar un módulo. Necesita diferentes paquetes para diferentes módulos. Por ejemplo, para instalar vpythonnecesita instalarlo comosudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc
1
no utilice sudo pip; Puede romper el sistema Python. Use apt-get para instalar paquetes para el sistema python. Puede usar la pip --useropción o virtualenv para instalar paquetes de Python por usted mismo.
jfs
21

En caso de que no queramos importar indeseadamente un módulo en cuestión (lo que sucedería en una trydeclaración), podemos utilizarlo sys.modulespara probar los módulos que están instalados y que fueron importados antes.

En el problema del shell de Python:

>>> import sys

Luego pruebe los módulos instalados:

>>> 'numpy' in sys.modules
True
>>> 'scipy' in sys.modules
False

Tenga en cuenta que solo los módulos que se importaron antes dan Trueen esta prueba, todos los demás módulos (incluso si están instalados) dan como resultadoFalse.

Otra alternativa a tryuna importdeclaración en la consola de Python es llamar a la help()función incorporada . Esto no proporcionará una documentación para módulos no instalados, p. Ej.

>>> help('scipy')
no Python documentation found for 'scipy'

Se puede interrumpir la salida de documentos de ayuda muy largos de los módulos instalados Q.

Ahora, para instalar los módulos que faltan, se recomienda usar la administración de paquetes de Ubuntu (y no la forma de Python pip) porque necesitamos acceso de root y también para evitar que se estropee nuestro sistema altamente dependiente de Python. Para el módulo en cuestión, esto sería, por ejemplo:

sudo apt-get install python-scipy ## for Python2
sudo apt-get install python3-scipy ## for Python3

Después de la instalación, podemos agregarlos al sys.modulesdiccionario importándolos una vez.

Takkat
fuente
1
Creo que esta es la respuesta más pitónica ...
Grijesh Chauhan
3
La primera parte de esto es incorrecta: sys.modulessolo contiene módulos que ya se han importado , por lo que no es una forma confiable de probar si se ha instalado un módulo. La prueba más confiable es usar try/exceptay atrapar el ImportError, como ya han sugerido varios otros.
ekhumoro
@ekhumoro: gracias, editaré mi respuesta para aclarar eso.
Takkat
44
Todavía no parece suficientemente claro. Dado que la pregunta es cómo averiguar si un módulo está instalado (no importado ), sys.moduleses completamente irrelevante y creo que cualquier mención de él es engañosa. Pero tal vez solo soy yo.
David Z
1
sys.modulesNo hay ninguna ayuda aquí.
gato
19

Otra forma es el pkgutilmódulo. Funciona con Python 2 y 3:

python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'

Debe reemplazar modulecon el nombre de su módulo, por ejemplo:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
Cuonglm
fuente
2
Te vi deshacer algunos de mis cambios; print()también funcionará bien en Python 2; Se trata como una sintaxis de grupo con padres y no tiene ningún efecto secundario. Solo cuando desee agregar varios elementos (ya print('a', 'b')que se tratará como un tuple, en el que necesita from __future__ import print_function, pero eso no es aplicable en este caso, puede escribir un código compatible con la adición agregando los parens (probé mis cambios) en Python 2 y 3.)
Martin Tournoij
@Carpetsmoker: Gracias por señalarlo. Retrocedo a la versión anterior.
Cuonglm
Esta es una respuesta genial. Agregué una respuesta derivada que devuelve un código de salida / estado (para el control de flujo de script de shell) y toma el nombre del módulo como argumento de línea de comando. askubuntu.com/a/891384/146273
Bruno Bronosky
¡Eso funciono! - Simplemente cambie a exitpara que se pueda usar en contexto de shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

Sé que el OP originalmente solicitó una solución después de iniciar Python, pero fuera de Python que uso pip. En ubuntu: sudo apt-get install python-pipsi aún no está instalado.

Luego, para ver qué módulos de terceros están disponibles, simplemente ejecute:

pip freeze

O incluso

pip list

Y ambos le mostrarán todos los módulos instalados y sus versiones.

Si el módulo que está buscando no está instalado, la mayoría de las veces puede instalarlo fácilmente con pip:

pip install <module-name>

Si no está seguro de si existe un módulo o cuál es su nombre PyPI, use pip search:

pip search <keyword>
OozeMeister
fuente
1
Además, pip show <module-name>mostrará si un paquete está instalado, por ejemplo pip show numpy.
Herpes Free Engineer
10

Podrías poner el código adentro try, exceptbloquear.

$ python3 -c "\
try:
    import cow  
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

There was no such module installed

$ python3 -c "\
try:
    import regex
    print('\nModule was installed')
except ImportError:
    print('\nThere was no such module installed')"

Module was installed
Avinash Raj
fuente
6

Para proporcionar otra respuesta, por el bien de la finalización:

Puede (ab) usar la -mopción. De la página de manual de Python:

   -m module-name
          Searches sys.path for the named module and runs the  correspond
          ing .py file as a script.

Lo que nos dará:

$ python2 -m numpy
/sbin/python2: No module named numpy.__main__; 'numpy' is a package and cannot be directly executed

$ python2 -m math
/sbin/python2: No code object available for math

Pero para módulos inexistentes, nos dará:

$ python2 -m doesnt_exist
/sbin/python2: No module named doesnt_exist

Podríamos usar greppara hacer coincidir esto:

$ python2 -m doesnt_exist |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Nope

$ python2 -m math |& grep -q 'No module named' && echo 'Nope' || echo 'Yup'
Yup

Esto es un poco hack-ish, y no es para lo que -mfue diseñado; pero es el método que requiere menos tipeo si desea una prueba rápida :-)

Martin Tournoij
fuente
44
grep -qhace que la redirección a nulo sea innecesaria.
muru
3
@muru Yikes! He escrito muchas redirecciones inútiles a lo /dev/nulllargo de los años: - /
Martin Tournoij
4

Escribí un ejemplo en Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
Mona Jalal
fuente
3

Comprobación de línea de Shell (útil para el aprovisionamiento)

Descubrí que para que mi aprovisionamiento de infraestructura sea idempotente, necesito poder verificar un paquete desde el shell en una línea. Me basé en la respuesta de @ cuonglm. Tuve que invertir el 1y 0porque estoy produciendo un estado de salida en lugar de imprimir una cadena.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader(sys.argv[1]) else 1)" pymongo

Puede reemplazarlo sys.argv[1]con el nombre entre comillas de su paquete, pero para mis scripts de aprovisionamiento me gusta la legibilidad de tenerlo al final.

python -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('pymongo') else 1)"

** Me doy cuenta de que chef , puppet y ansible tienen complementos para administrar paquetes de python, pero es posible que te encuentres en una situación como la mía en la que estás usando una versión desactualizada y no quieres usar complementos obsoletos.

Bruno Bronosky
fuente
1

También se puede usar pydoc modules, que se puede filtrar greppara encontrar un módulo específico. La salida se muestra en formato de columnas. La única desventaja de este enfoque es que también incluirá archivos de Python en el directorio de trabajo actual. Sin embargo, lo uso la mayor parte del tiempo y es uno de los enfoques altamente citados en esta pregunta relacionada: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
fuente
0

Desde Ubuntu Shell, por defecto bash, tan simple como

pip list | grep <package-name-Case-Matters>

Ejemplos

pip list | grep pywinrm

pip list | grep numpy

Y, si tiene dudas sobre el caso (aunque creo que todos los nombres de los paquetes siempre están en minúsculas):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy
xCovelus
fuente