Qual é uma boa maneira de verificar se um pacote está instalado dentro de um script Python? Sei que é fácil para o intérprete, mas preciso fazer isso dentro de um script.
Acho que poderia verificar se há um diretório no sistema que foi criado durante a instalação, mas acho que há uma maneira melhor. Estou tentando ter certeza de que o pacote Skype4Py está instalado, caso contrário, irei instalá-lo.
Minhas ideias para realizar a verificação
- verifique se há um diretório no caminho de instalação típico
- tente importar o pacote e se uma exceção for lançada, então instale o pacote
python
package
skype
python-import
Kevin
fonte
fonte
Respostas:
Se você se refere a um script Python, faça algo assim:
Python 3.3+ usa sys.modules e find_spec :
Python 3:
Python 2:
fonte
Resposta atualizada
A melhor maneira de fazer isso é:
O resultado:
Verifique se
requests
está instalado:Por que assim? Às vezes, você tem conflitos de nomes de aplicativos. Importar do namespace do aplicativo não fornece uma imagem completa do que está instalado no sistema.
Observe que a solução proposta funciona:
pip install http://some.site/package-name.zip
ou qualquer outro tipo de arquivo).python setup.py install
.sudo apt install python-requests
.Casos em que pode não funcionar:
python setup.py develop
.pip install -e /path/to/package/source/
.Resposta antiga
A melhor maneira de fazer isso é:
Para pip> = 10.x, use:
Por que assim? Às vezes, você tem conflitos de nomes de aplicativos. Importar do namespace do aplicativo não fornece uma imagem completa do que está instalado no sistema.
Como resultado, você obtém uma lista de
pkg_resources.Distribution
objetos. Veja o seguinte como exemplo:Faça uma lista disso:
Verifique se
requests
está instalado:fonte
import json
está realmente funcionando). O método de ice.nicer está funcionando neste caso.if "u'requests'" in installed_packages:
da Resposta atualizada para trabalhar para mim. A saída deprint()
produz isso no meu macOS python:[..., u'pytz', u'requests', ...]
if "requests'"
(observe a aspa simples no final). não faz sentido algum.pip
. Por exemplo, você pode fazer e instalar um pacote do código-fonte. Esta resposta não os encontrará. A resposta de @ ice.nicer sobrefind_spec()
está certa.A partir do Python 3.3, você pode usar o método find_spec ()
fonte
importlib.util.find_spec('google-cloud-logging')
não encontra nada enquantoimportlib.util.find_spec('google.cloud.logging')
for encontrado. O nome oficial e o nome que pip mostra são traços, não pontos. Pode ser confuso, portanto, use com cuidado.Se você quiser ter a verificação do terminal, você pode executar
e se nada for retornado, o pacote não está instalado.
Se talvez você queira automatizar essa verificação, de forma que, por exemplo, você possa instalá-la se estiver faltando, você pode ter o seguinte em seu script bash:
fonte
if
para testar diretamente um comando bem-sucedido:if pip3 show package_name 1>/dev/null; then ...
Como uma extensão desta resposta :
Para Python 2. *,
pip show <package_name>
executará a mesma tarefa.Por exemplo
pip show numpy
, retornará o seguinte ou algo semelhante:fonte
Você pode usar o módulo pkg_resources do setuptools. Por exemplo:
Observe que há uma diferença entre o módulo python e um pacote python. Um pacote pode conter vários módulos e os nomes dos módulos podem não corresponder ao nome do pacote.
fonte
Abra o seu tipo de prompt de comando
fonte
Eu gostaria de adicionar algumas idéias / descobertas minhas a este tópico. Estou escrevendo um script que verifica todos os requisitos de um programa personalizado. Existem muitas verificações com módulos python também.
Há um pequeno problema com o
solução. No meu caso, um dos módulos python foi chamado
python-nmap
, mas você o importa comimport nmap
e como vê os nomes incompatíveis. Portanto, o teste com a solução acima retorna um resultado False e também importa o módulo ao acertar, mas talvez não seja necessário usar muita memória para um teste / verificação simples.Eu também descobri que
installed_packages
terá apenas os pacotes que foram instalados com pip . No meu sistemapip freeze
retorna sobre40
módulos python, enquantoinstalled_packages
tem apenas1
, o que instalei manualmente (python-nmap).Outra solução abaixo que eu sei que pode não ser relevante para a questão , mas acho uma boa prática manter a função de teste separada daquela que executa a instalação, ela pode ser útil para alguns.
A solução que funcionou para mim. É com base nesta resposta como verificar se existe um módulo python sem importá-lo
NOTA: esta solução também não consegue encontrar o módulo pelo nome
python-nmap
, eu tenho que usar nonmap
lugar (fácil de conviver), mas neste caso o módulo não será carregado na memória de forma alguma.fonte
Se quiser que seu script instale os pacotes ausentes e continue, você pode fazer algo assim (no exemplo do módulo 'krbV' no pacote 'python-krbV'):
fonte
Uma maneira rápida é usar a ferramenta de linha de comando python . Basta digitar.
import <your module name>
Você verá um erro se o módulo estiver ausente.fonte
Hmmm ... o mais próximo que vi de uma resposta conveniente foi usar a linha de comando para tentar a importação. Mas prefiro até evitar isso.
Que tal 'pip freeze | grep pkgname '? Eu tentei e funciona bem. Também mostra a versão que possui e se está instalado sob controle de versão (instalar) ou editável (desenvolver).
fonte
class myError (exceção): pass #ou faça alguma coisa tente: import mymodule exceto ImportError as e: raise myError ("ocorreu um erro")
fonte
No tipo de Terminal
Exemplo
fonte
Eu gostaria de comentar a resposta de @ ice.nicer, mas não posso, então ... Minhas observações são que pacotes com traços são salvos com sublinhados, não apenas com pontos, como apontado pelo comentário de @dwich
Por exemplo, você faz
pip3 install sphinx-rtd-theme
, mas:importlib.util.find_spec(sphinx_rtd_theme)
retorna um objetoimportlib.util.find_spec(sphinx-rtd-theme)
retorna nenhumimportlib.util.find_spec(sphinx.rtd.theme)
levanta ModuleNotFoundErrorAlém disso, alguns nomes são totalmente alterados. Por exemplo, você faz,
pip3 install pyyaml
mas é salvo simplesmente comoyaml
Estou usando o python3.8
fonte
fonte
Vá para a opção nº 2. Se
ImportError
for lançado, o pacote não está instalado (ou não estásys.path
).fonte