Respostas:
Você deve usar pip
o list
comando 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 boto
quando botocore
também está instalado, usar em -w
vez de -F
pode ajudar, como sugere @TaraPrasadGurung. Isso não lista o pacote exato, pois -w
vê caracteres comuns nos nomes dos pacotes como limites de palavras. Portanto, se você possui requests
e requests-cache
instalou or ruamel.yaml
ruamel.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 é pip
compatível ao lidar com pacotes de namespace.
-w
como 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.yaml
ougrep -w request
pip list | grep -F mxnet-cu101
imprime mxnet-cu101 1.5.0
, mas não exatamente onde está instalado. alguma idéia de como obter o caminho instalado? `
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
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.
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
em um shell / prompt do Python. :
>>> help('modules')
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.
pip install
. Se já estiver instalado, não o instalará novamente.