Como verificar se um módulo ou pacote já está instalado no python3?


10

É necessário verificar se ele está instalado ou não antes que o programa possa ser executado.


2
Basta executar o pip install. Se já estiver instalado, não o instalará novamente.
Jordanm # 10/15

Obrigado, mas eu preciso verificar e dar ao / p, em seguida, teste.
hubatrix

Respostas:


3

Digite o shell: pydoc modules.
Isso listará os módulos e você pode fazer a grep do módulo que deseja.
Encontrado no stackoverflow aqui


11

Você deve usar pipo listcomando s com grep, que lista apenas os pacotes instalados (nem todos os módulos e seus vizinhos):

pip list | grep -F package_name

Se package_name corresponder a vários pacotes instalados, por exemplo, procurar botoquando botocoretambém está instalado, usar em -wvez de -Fpode ajudar, como sugere @TaraPrasadGurung. Isso não lista o pacote exato, pois -wvê caracteres comuns nos nomes dos pacotes como limites de palavras. Portanto, se você possui requestse requests-cacheinstalou or ruamel.yamlruamel.yaml.cmd` e precisa de exatamente uma linha de saída, precisa fazer algo como:

pip list --disable-pip-version-check | grep -E "^ruamel\.yaml "

Por favor, note que desde que .corresponde a qualquer caractere quando usando -E, você precisa escapar it.¹


¹ E sim que é necessário que haja um pacote ruamel_yaml. Nem todo gerenciador de pacotes é pipcompatível ao lidar com pacotes de namespace.


O problema é que, se o nome do pacote boto e o botocore estiver instalado, ele listará os dois. Portanto, a melhor solução será usar sinalizador -w vez de -F para listar o pacote exato
Tara Prasad Gurung

@TaraPrasadGurung Embora isso possa ajudar a reduzir um pouco a saída, não ajuda a obter o pacote exato como você afirma. Por exemplo, o ponto e o traço são usados -wcomo limites de palavras e são comuns nos nomes de pacotes. Eu recebo várias correspondências quando uso sua sugestão usando grep -w ruamel.yamlougrep -w request
Anthon

pip list | grep -F mxnet-cu101imprime mxnet-cu101 1.5.0, mas não exatamente onde está instalado. alguma idéia de como obter o caminho instalado? `
Anu

@ qualquer Sim, eu tenho uma boa idéia sobre como recuperar onde um pacote Python está instalado, dado que eu sei o seu nome. Você deve postar uma pergunta neste site e me enviar um ping aqui para receber minha atenção quando o fizer, pois não sigo as perguntas recém-publicadas sobre U&L.
Anthon

4

Se o pacote não fizer algo louco ou demorado na importação, você pode tentar realmente importá-lo:

if python -c "import package_name" &> /dev/null; then
    echo 'all good'
else
    echo 'uh oh'
fi

2

Eu encontrei as respostas existentes incompletas e sem exemplos suficientes. Aqui está a solução em que me decidi:

# an example checking if the pandas package is installed
if python -c 'import pkgutil; exit(not pkgutil.find_loader("pandas"))'; then
    echo 'pandas found'
else
    echo 'pandas not found'
fi

Uma essência do Github deste exemplo pode ser encontrada aqui: https://gist.github.com/shaypal5/d505af9953cd86f59c750fa600ee4ba6


este parece realmente semelhante a uma resposta existente
Jeff Schaller

1
O código do bash é semelhante, o código do Python é diferente, o que faz muita diferença. Li todas as respostas existentes antes de optar por adicionar as minhas, e a resposta específica à qual você vinculou não funcionou para mim. Portanto, acho relevante e valioso adicionar minha resposta aqui. :)
ShayPal5

1

Você também pode usar algo assim em seus scripts.

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

O que você obteria quando um pacote não estiver instalado.

Package=psutil
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
1

O que você obteria quando um pacote estiver instalado.

Package=requests
python3 -c "import sys, pkgutil; sys.exit(0 if pkgutil.find_loader('$Package') else 1)"
echo $?
0

Funciona em python2 e python3 e, em seguida, você instala com base no código de saída.


0

Eu usei uma versão um pouco mais rigorosa da resposta de Anthon, para uso em um script:

pip3 list |
    grep -v "^Package *Version$" | grep -v "^-*$" |
    cut -d ' ' -f 1 |
    grep -xF "$package_name"

Os dois primeiros greps destinam-se a remover as linhas do cabeçalho da saída do pip3.

O corte seleciona apenas os nomes dos pacotes (descartando os números de versão).

Em seguida, o grep final pode executar uma pesquisa exata pelos $package_name

Se o pacote for encontrado, ele exibirá o nome do pacote e retornará com o código de saída 0. Se você não quiser ver o nome do pacote, termine o comando com >/dev/null



0

Testado com pip3:

$> pip3 show MODULENAME

O código de saída ($?) Seria "0" no caso de o módulo estar instalado, senão "1".

O Grepping tem o problema de "falsos positivos": A saída de um

pip list | grep NAME

corresponderia a qualquer módulo cujo nome contenha "NAME", por exemplo, também corresponderá a "some_other_NAME".

Enquanto

pip3 show MODULENAME

somente combinações em partidas completas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.