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

89

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

  • Como vou instalá-lo se não estiver instalado?
  • Como vou saber se ele já está instalado?
TechJhola
fonte

Respostas:

73

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 vou instalá-lo se não estiver instalado

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

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

Como alternativa Você também pode instalar um módulo python usando python-pipo sugerido por Zack Titan no comentário abaixo : Para instalar, numpyvocê pode usar

pip install numpy

Aviso: É altamente recomendável instalar python-modules usando apenas o repositório oficial do Ubuntu e não usar o pipmétodo como superusuário (ou seja, como rootou usando sudo). Em alguns casos, ele pode deixar seu sistema inutilizável, quebrando o python do sistema.

Como instalar pacotes usando pipno ambiente virtual local.

souravc
fonte
Como na sua resposta, o módulo matemático existe e para numby o traceback não apareceu e para echo $? saída foi 0, isso significa que o numpy também está presente no meu sistema?
22415 TechJhola
1
sim, está lá no seu sistema.
souravc
Caso você não possua o módulo numpy, como importá-lo? Quando fazemos a codificação, chamamos a instrução import de from numpy import *, ele instalará o módulo? Caso contrário, como instalaremos um novo módulo?
22415 TechJhola
1
Será uma pergunta separada como instalar um módulo. Precisa de pacotes diferentes para diferentes módulos. Por exemplo, para instalar, vpythonvocê precisa instalá-lo comosudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
souravc 22/02
1
não use sudo pip; pode quebrar o python do sistema. Use o apt-get para instalar pacotes para o python do sistema. Você pode usar pip --useroption ou virtualenv para instalar os pacotes Python por conta própria.
jfs
21

Caso não desejemos importar indesejadamente um módulo em questão (o que aconteceria em uma trydeclaração), podemos utilizá-lo sys.modulespara testar módulos instalados e importados anteriormente.

No problema do shell python:

>>> import sys

Em seguida, teste os módulos instalados:

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

Observe que apenas os módulos que foram importados antes Truedesse teste, todos os outros módulos (mesmo que instalados) resultam emFalse.

Outra alternativa para tryuma importdeclaração no console python é chamar a help()função embutida. 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 dos módulos instalados pode ser interrompida Q.

Agora, para instalar os módulos ausentes, é recomendável usar o gerenciamento de pacotes do Ubuntu (e não o caminho do Python), porque precisamos de acesso root e também para evitar atrapalhar nosso sistema fortemente dependente de Python. Para o módulo em questão, isto seria, por exemplo:

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 sys.modulesdicionário importando-os uma vez.

Takkat
fonte
1
Eu acho que essa é a resposta mais Pythonic ....
Grijesh Chauhan
3
A primeira parte está errada: sys.modulescontém apenas módulos que já foram importados , portanto, não é uma maneira confiável de testar se um módulo foi instalado. O teste mais confiável é usar try/excepte prender o ImportError, como vários outros já sugeriram.
ekhumoro
@ekhumoro - obrigado, vou editar minha resposta para deixar isso mais claro.
Takkat 22/02
4
Ainda não parece suficientemente claro. Dado que a pergunta é perguntar como descobrir se um módulo está instalado (não importado ), sys.modulesé totalmente irrelevante e acho que qualquer menção a ele é enganosa. Mas talvez seja só eu.
David Z
1
sys.modulesnão há nenhuma ajuda aqui.
cat
19

Outra maneira é o pkgutilmódulo. Funciona com o Python 2 e 3:

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

Você precisa substituir modulepelo nome do seu módulo, exemplo:

$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
cuonglm
fonte
2
Eu vi você desfazer algumas das minhas alterações; print()também funcionará bem em Python 2; É tratado como uma sintaxe do grupo com parênteses e não tem efeitos colaterais. Somente quando você deseja adicionar vários itens (como print('a', 'b')ele será tratado como um tuple, no qual você precisa from __future__ import print_function, mas não é aplicável nesse caso, você pode simplesmente escrever um código compatível com a frente adicionando os parâmetros) (eu testei minhas alterações em Python 2 e 3).
Martin Tournoij
@Carpetsmoker: Obrigado por apontar. Eu reverto para a versão antiga.
cuonglm
Esta é uma ótima resposta. Eu adicionei uma resposta derivada que retorna um código de saída / status (para controle de fluxo do shell script) e leva o nome do módulo como um argumento de linha de comando. askubuntu.com/a/891384/146273
de Bruno Bronosky
Isso funcionou! - Apenas mude para exitpara que possa ser usado no contexto do shell:python -c 'import pkgutil; exit(0 if pkgutil.find_loader("math") else 2)'
AT
12

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

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

pip freeze

Ou até

pip list

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

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

pip install <module-name>

Se você não tiver certeza da existência de um módulo ou qual é o nome do PyPI, use pip search:

pip search <keyword>
OozeMeister
fonte
1
Além disso, pip show <module-name>mostrará se um pacote está instalado, por exemplo pip show numpy.
Herpes Free Engineer
10

Você pode colocar o código dentro try, exceptbloco.

$ 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
fonte
6

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

Você pode (ab) usar a -mopção Na página de manual 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 greppara 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 o que -mfoi planejado; mas é o método que requer menos digitação, se você quiser um teste rápido :-)

Martin Tournoij
fonte
4
grep -qtorna desnecessário o redirecionamento para nulo.
muru
3
@muru Yikes! Ao /dev/nulllongo dos anos, digitei muitos redirecionamentos inúteis : - /
Martin Tournoij
4

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'])
Mona Jalal
fonte
3

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

Descobri que, para tornar meu provisionamento de infraestrutura ** idempotente, preciso verificar se há um pacote do shell em um oneliner. Eu desenvolvi a resposta do @ cuonglm. Eu tive que reverter o 1e 0porque 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 nome sys.argv[1]com aspas simples do seu pacote, mas, para meus scripts de provisionamento, gosto da legibilidade de tê-lo no final.

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

** Percebo que chef , fantoche e ansible têm todos plugins para gerenciar pacotes python, mas você pode se encontrar em uma situação como eu em que você está usando uma versão desatualizada e não deseja usar plug-ins obsoletos.

Bruno Bronosky
fonte
1

Pode-se também usar pydoc modules, que pode ser filtrado com greppara encontrar um módulo específico. A saída é exibida em formato de coluna. A única desvantagem dessa abordagem é que ela também incluirá arquivos python no diretório de trabalho atual. No entanto, eu mesmo o uso na maioria das vezes e é uma das abordagens mais citadas nesta questão relacionada: https://stackoverflow.com/q/739993/3701431

Sergiy Kolodyazhnyy
fonte
0

No Shell do Ubuntu, por padrão, 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 de pacotes sejam sempre minúsculos):

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