Pergunta

O que é uma boa maneira de verificar se um pacote é instalado, enquanto dentro de um script Python? Eu sei que é fácil a partir do intérprete, mas eu preciso fazê-lo dentro de um script.

Eu acho que eu poderia verificar se existe um diretório no sistema que é criado durante a instalação, mas eu sinto que há uma maneira melhor. Eu estou tentando garantir que o pacote Skype4Py está instalado, e se não eu vou instalá-lo.

As minhas idéias para realizar a verificação

  • cheque de um diretório no típico caminho de instalação
  • tentar importar o pacote e se uma exceção é jogar, em seguida, instalar o pacote
Foi útil?

Solução

Se você quer dizer um script Python, basta fazer algo como isto:

try:
 import mymodule
except ImportError, e:
 pass # module doesn't exist, deal with it.

Outras dicas

resposta Atualizado

A melhor maneira de fazer isto é:

import subprocess
import sys

reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze'])
installed_packages = [r.decode().split('==')[0] for r in reqs.split()]

O resultado:

print(installed_packages)

[
    "Django",
    "six",
    "requests",
]

Verifique se requests está instalado:

if 'requests' in installed_packages:
    # Do something

Por este caminho? Às vezes você tem colisões nome do aplicativo. Importando do namespace aplicativo não dar-lhe a imagem completa do que está instalado no sistema.

resposta Old

A melhor maneira de fazer isto é:

import pip
installed_packages = pip.get_installed_distributions()

Para pip> = 10.x uso:

from pip._internal.utils.misc import get_installed_distributions

Por este caminho? Às vezes você tem colisões nome do aplicativo. Importando do namespace aplicativo não dar-lhe a imagem completa do que está instalado no sistema.

Como resultado, você tem uma lista de objetos pkg_resources.Distribution. Veja a seguir como um exemplo:

print installed_packages
[
    "Django 1.6.4 (/path-to-your-env/lib/python2.7/site-packages)",
    "six 1.6.1 (/path-to-your-env/lib/python2.7/site-packages)",
    "requests 2.5.0 (/path-to-your-env/lib/python2.7/site-packages)",
]

Faça uma lista de que:

flat_installed_packages = [package.project_name for package in installed_packages]

[
    "Django",
    "six",
    "requests",
]

Verifique se requests está instalado:

if 'requests' in flat_installed_packages:
    # Do something

A partir do Python 3.3, você pode usar o find_spec () método

import importlib.util
import sys

# For illustrative purposes.
package_name = 'pandas'

spec = importlib.util.find_spec(package_name)
if spec is None:
    print(package_name +" is not installed")

Se você quer ter a verificação do terminal, você pode executar

pip3 show package_name

e se nada for devolvido, o pacote não está instalado.

Se talvez você deseja automatizar esta verificação, de modo que, por exemplo, você pode instalá-lo se perdendo, você pode ter o seguinte no seu script bash:

pip3 show package_name 1>/dev/null #pip for Python 2
if [ $? == 0 ]; then
   echo "Installed" #Replace with your actions
else
   echo "Not Installed" #Replace with your actions, 'pip3 install --upgrade package_name' ?
fi

Como uma extensão do esta resposta :

Para Python 2. *, pip show <package_name> irá executar a mesma tarefa.

Por exemplo pip show numpy retornará a seguinte ou similar:

Name: numpy
Version: 1.11.1
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
Author-email: numpy-discussion@scipy.org
License: BSD
Location: /home/***/anaconda2/lib/python2.7/site-packages
Requires: 
Required-by: smop, pandas, tables, spectrum, seaborn, patsy, odo, numpy-stl, numba, nfft, netCDF4, MDAnalysis, matplotlib, h5py, GridDataFormats, dynd, datashape, Bottleneck, blaze, astropy

Você pode usar o módulo pkg_resources de setuptools. Por exemplo:

import pkg_resources

package_name = 'cool_package'
try:
    cool_package_dist_info = pkg_resources.get_distribution(package_name)
except pkg_resources.DistributionNotFound:
    print('{} not installed'.format(package_name))
else:
    print(cool_package_dist_info)

Note-se que há uma diferença entre o módulo python e um pacote de python. Um pacote pode conter vários módulos e nomes do módulo pode não coincidir com o nome do pacote.

Eu gostaria de acrescentar alguns pensamentos / conclusões da mina para este tópico. Eu estou escrevendo um script que verifica todos os requisitos para uma custom made programa. Há muitos cheques com módulos python também.

Há um pequeno problema com o

try:
   import ..
except:
   ..

solução. No meu caso um dos módulos Python chamado python-nmap, mas você importá-lo com import nmap e como você vê os nomes incompatibilidade. Portanto, o teste com a solução acima retorna um resultado falso, e também importa o módulo em hit, mas talvez não há necessidade de usar um monte de memória para um teste simples / cheque.

Eu também achei que

import pip
installed_packages = pip.get_installed_distributions()

installed_packages terá apenas os pacotes tem sido instalado com pip . Em meus pip freeze sistema de retornos mais módulos python 40, enquanto installed_packages tem apenas 1, o que eu instalado manualmente (python-nmap).

Outra solução abaixo que eu sei que pode não ser relevante para a questão , mas eu acho que é uma boa prática para manter a função de teste separado daquele que realiza o instalação pode ser útil para alguns.

A solução que funcionou para mim. É com base nesta resposta Como verificar se um módulo python existe sem importá-lo

from imp import find_module

def checkPythonmod(mod):
    try:
        op = find_module(mod)
        return True
    except ImportError:
        return False

NOTA:. Esta solução não pode encontrar o módulo pelo nome python-nmap também, eu tenho que usar nmap vez (fácil viver com), mas neste caso o módulo não será carregado para a memória qualquer

Se você gostaria de seu script para instalar os pacotes em falta e continuar, você poderia fazer algo assim (no exemplo de 'krbV' módulo 'python-krbV' pacote):

import pip
import sys

for m, pkg in [('krbV', 'python-krbV')]:
    try:
        setattr(sys.modules[__name__], m, __import__(m))
    except ImportError:
        pip.main(['install', pkg])
        setattr(sys.modules[__name__], m, __import__(m))

Uma maneira rápida é usar python ferramenta de linha de comando. import <your module name> simplesmente tipo Você vê um erro se o módulo está faltando.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
>>> import sys
>>> import jocker
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named jocker
$

Go opção # 2. Se ImportError é jogado, em seguida, o pacote não está instalado (ou não em sys.path).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top