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.

hubatrix
fonte
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

mazs
fonte
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.

Anthon
fonte
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
Dmiters
fonte
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

ShayPal5
fonte
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.

RJ
fonte
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

joeytwiddle
fonte
0

em um shell / prompt do Python. :

>>> help('modules')
O método científico
fonte
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.

Thomas Hofmann
fonte