Como posso verificar se um módulo está instalado no Python e instalá-lo, se necessário?

79

No terminal, depois de iniciar o Python, como saberei quais são os módulos presentes no python? Suponha que eu precise aprender os módulos NumPy e SciPy.

  • Como instalarei se não estiver instalado?
  • Como vou saber se já está instalado?
por TechJhola 22.02.2015 / 04:09

10 respostas

64

Como saber se um módulo python está instalado ou não no sistema: Você pode fazer um teste muito fácil no 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

Como instalarei se não estiver instalado

Você pode instalar um módulo específico baixando os respectivos pacotes do repositório, por exemplo, você pode instalar scipy como

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

Alternadamente Você também pode instalar um módulo python usando python-pip como sugerido por Zack Titan no comentário abaixo , Para instalar numpy você pode usar

pip install numpy

Aviso: É altamente recomendado instalar o python-modules usando apenas o repositório oficial do Ubuntu e não usar o método pip como superusuário (por exemplo, como root ou usando sudo ). Em alguns casos, pode deixar seu sistema inutilizável ao quebrar o sistema Python.

Como instalar pacotes usando pip no ambiente virtual local.

    
por souravc 22.02.2015 / 04:28
21

Caso não desejemos importar um módulo indesejado em questão (o que aconteceria em uma instrução try ), poderemos usar sys.modules para testar os módulos instalados e importado antes.

No problema do shell do python:

>>> import sys

Em seguida, teste os módulos instalados:

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

Observe que somente os módulos que foram importados antes dão True neste teste, todos os outros módulos (mesmo se instalados) resultam em False.

Outra alternativa para a instrução try an import no console python está chamando a função help() inbuilt. Isso não fornecerá uma documentação para módulos não instalados, por exemplo,

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

A saída de documentos de ajuda muito longos de módulos instalados pode ser interrompida com Q .

Agora, para instalar os módulos ausentes, recomenda-se usar o gerenciamento de pacotes do Ubuntu (e não o modo pip do Python) porque precisamos de acesso root e também para evitar problemas com nosso sistema dependente do Python. Para o módulo em questão, isto, por exemplo, seja:

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

Após a instalação, podemos adicioná-los ao dicionário sys.modules , importando-os uma vez.

    
por Takkat 22.02.2015 / 12:23
17

Outra forma é o módulo pkgutil . Funciona com o Python 2 & 3:

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

Você precisa substituir module pelo nome do seu módulo, por exemplo:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
    
por cuonglm 22.02.2015 / 20:53
11

Eu sei que o OP originalmente pediu uma solução depois de iniciar o Python, mas fora do python eu usei pip . No Ubuntu: sudo apt-get install python-pip , se ainda não estiver instalado.

Em seguida, para ver quais módulos de terceiros estão disponíveis, basta executar:

pip freeze

Ou até mesmo

pip list

E ambos mostrarão todos os módulos instalados e suas versões.

Se o módulo que você está procurando não estiver instalado, na maioria das vezes você pode instalá-lo facilmente com o pip:

pip install <module-name>

Se você não tiver certeza se existe um módulo ou qual é o nome do PyPI, use pip search :

pip search <keyword>
    
por OozeMeister 23.02.2015 / 03:13
10

Você pode colocar o código em try , except block.

$ 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
    
por Avinash Raj 22.02.2015 / 08:56
6

Para fornecer outra resposta, para fins de conclusão:

Você pode (ab) usar a opção -m . Da página do Python:

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

O 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

Mas para módulos inexistentes, isso nos dará:

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

Poderíamos usar grep para corresponder a isso:

$ 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

Isso é um pouco hack-ish e não para o qual -m foi destinado; mas é o método que requer menos digitação se você quiser um teste rápido: -)

    
por Martin Tournoij 22.02.2015 / 20:04
3

Eu escrevi um exemplo em Python:

import pip
import sys
from bigml.api import BigML


if not 'bigml' in sys.modules.keys():
    pip.main(['install', 'bigml'])
    
por Mona Jalal 21.10.2016 / 21:57
3

Verificação de shell oneliner (útil para provisionamento)

Descobri que, para tornar meu provisionamento de infraestrutura ** idempotente, preciso verificar um pacote do shell em um oneliner. Eu construí na resposta do @ cuonglm. Eu tive que reverter o 1 e 0 porque estou produzindo um status de saída em vez de imprimir uma string.

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

Você pode substituir o sys.argv[1] pelo nome com aspas simples do seu pacote, mas, para meus scripts de aprovisionamento, gosto da legibilidade de tê-lo no final.

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

** Eu sei que o chef , puppet , e ansible todos têm plugins para gerenciar pacotes python, mas você pode encontrar-se em uma situação como eu, onde você está usando uma versão desatualizada e não quer usar plugins obsoletos.

    
por Bruno Bronosky 09.03.2017 / 20:25
1

Também é possível usar pydoc modules , que pode ser filtrado com grep para encontrar um módulo específico. A saída é exibida no formato em colunas. A única desvantagem dessa abordagem é que ela também incluirá arquivos python no diretório de trabalho atual. No entanto, eu uso-o a maior parte do tempo e é uma das abordagens mais citadas nesta questão relacionada: link

    
por Sergiy Kolodyazhnyy 06.01.2017 / 12:24
0

Do Ubuntu Shell, por padrão bash, tão simples quanto

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

Exemplos

pip list | grep pywinrm

pip list | grep numpy

E, se você tiver dúvidas sobre o caso (embora eu ache que todos os nomes dos pacotes estão sempre em minúsculas):

pip list | grep [Nn]um[Pp]y  # it works with numpy, Numpy, numPy, and NumPy
    
por 11.04.2019 / 12:04