Respostas:
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
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-pip
o sugerido por Zack Titan no comentário abaixo : Para instalar, numpy
você 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 pip
método como superusuário (ou seja, como root
ou usando sudo
). Em alguns casos, ele pode deixar seu sistema inutilizável, quebrando o python do sistema.
vpython
você precisa instalá-lo comosudo apt-get install python-visual libgtkglextmm-x11-1.2-dev
sudo pip
; pode quebrar o python do sistema. Use o apt-get para instalar pacotes para o python do sistema. Você pode usar pip --user
option ou virtualenv para instalar os pacotes Python por conta própria.
Caso não desejemos importar indesejadamente um módulo em questão (o que aconteceria em uma try
declaração), podemos utilizá-lo sys.modules
para 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 True
desse teste, todos os outros módulos (mesmo que instalados) resultam emFalse.
Outra alternativa para try
uma import
declaraçã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.modules
dicionário importando-os uma vez.
sys.modules
conté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/except
e prender o ImportError
, como vários outros já sugeriram.
sys.modules
é totalmente irrelevante e acho que qualquer menção a ele é enganosa. Mas talvez seja só eu.
sys.modules
não há nenhuma ajuda aqui.
Outra maneira é o pkgutil
módulo. Funciona com o Python 2 e 3:
python -c 'import pkgutil; print(1 if pkgutil.find_loader("module") else 0)'
Você precisa substituir module
pelo nome do seu módulo, exemplo:
$ python -c 'import pkgutil; print(1 if pkgutil.find_loader("math") else 0)'
1
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).
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-pip
se 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>
pip show <module-name>
mostrará se um pacote está instalado, por exemplo pip show numpy
.
Você pode colocar o código dentro try
, except
bloco.
$ 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
Para fornecer outra resposta, para fins de conclusão:
Você pode (ab) usar a -m
opçã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 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 o que -m
foi planejado; mas é o método que requer menos digitação, se você quiser um teste rápido :-)
grep -q
torna desnecessário o redirecionamento para nulo.
/dev/null
longo dos anos, digitei muitos redirecionamentos inúteis : - /
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'])
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 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 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.
Pode-se também usar pydoc modules
, que pode ser filtrado com grep
para 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
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
No momento em que escrevi isso, pip show ...
parece ser a maneira mais fácil:
https://pip.pypa.io/en/stable/reference/pip_show/
Mas é silencioso (ou seja, não retorna nada) quando o pacote não está instalado.