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-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.
vpythonvocê 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 --useroption 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 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.
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.
sys.modulesé totalmente irrelevante e acho que qualquer menção a ele é enganosa. Mas talvez seja só eu.
sys.modulesnão há nenhuma ajuda aqui.
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
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-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>
pip show <module-name>mostrará se um pacote está instalado, por exemplo pip show numpy.
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
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 :-)
grep -qtorna desnecessário o redirecionamento para nulo.
/dev/nulllongo 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 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.
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
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.