Existe uma maneira de encontrar todos os pacotes PyPI PyPI que foram instalados com easy_install ou pip? Quero dizer, excluindo tudo o que foi / está instalado com as ferramentas de distribuição (neste caso, o apt-get no Debian).
Existe uma maneira de encontrar todos os pacotes PyPI PyPI que foram instalados com easy_install ou pip? Quero dizer, excluindo tudo o que foi / está instalado com as ferramentas de distribuição (neste caso, o apt-get no Debian).
Respostas:
pip freeze
produzirá uma lista de pacotes instalados e suas versões. Também permite gravar esses pacotes em um arquivo que pode ser usado posteriormente para configurar um novo ambiente.
https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze
pip freeze
e pip list
liste tudo. Eles não excluem os pacotes que não foram instalados por pip
.
pip freeze
que é confiável em scripts, enquanto pip list
gera erros inesperados ao ser usado com pipes.
pip list -l
Ou pip list --local
é a melhor resposta, consulte stackoverflow.com/a/43012269/491884 por @MJB
A partir da versão 1.3 do pip, agora você pode usar pip list
Possui algumas opções úteis, incluindo a capacidade de mostrar pacotes desatualizados. Aqui está a documentação: https://pip.pypa.io/en/latest/reference/pip_list/
pip freeze
pip list --user
mostra apenas pacotes instalados pelo usuário e exclui pacotes de todo o sistema.
Se alguém estiver se perguntando, você pode usar o comando 'pip show'.
pip show [options] <package>
Isso listará o diretório de instalação do pacote fornecido.
Se o Debian se comporta como as versões recentes do Ubuntu em relação ao pip install
destino padrão, é fácil: ele é instalado em /usr/local/lib/
vez de /usr/lib
( apt
destino padrão). Verifique /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747
Eu sou um usuário do ArchLinux e, ao experimentar o pip, encontrei o mesmo problema. Aqui está como eu o resolvi no Arch.
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'
A chave aqui é /usr/lib/python2.7/site-packages
, para qual diretório o pip é instalado, YMMV. pacman -Qo
é como do Arco pac kage homem cheques ager para a propriedade do arquivo. No package
é parte do retorno que dá quando nenhum pacote possui o arquivo: error: No package owns $FILENAME
. Solução complicada: estou consultando, __init__.py
porque pacman -Qo
é um pouco ignorante quando se trata de diretórios :(
Para fazer isso em outras distros, você precisa descobrir onde as pip
coisas são instaladas (apenas sudo pip install
algo), como consultar a propriedade de um arquivo (é o método Debian / Ubuntu dpkg -S
) e qual é o retorno "nenhum pacote possui esse caminho" (Debian / Ubuntu é no path found matching pattern
). Usuários Debian / Ubuntu, cuidado: dpkg -S
falhará se você der um link simbólico. Apenas resolva-o primeiro usando realpath
. Como isso:
find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'
Os usuários do Fedora podem tentar (obrigado @eddygeek):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
dpkg
escreva o erro em stderr, então eu tenho que adicionar um redirecionamento 2>&1
. E para produção internacional, adicione LANG=
na frente xargs dpkg -s
. e sed
também é uma boa ferramenta;) para manter apenas o nome do pacote do caminho. Então, acabo com:find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | LANG= xargs dpkg -S 2>&1 | grep 'no path found' | sed "s/.*\/\([^\/]*\)\/__init__\.py.*/\1/"
Começar com:
$ pip list
Para listar todos os pacotes. Depois de encontrar o pacote desejado, use:
$ pip show <package-name>
Isso mostrará detalhes sobre este pacote, incluindo sua pasta. Você pode pular a primeira parte se já souber o nome do pacote
Clique aqui para obter mais informações sobre o pip show e aqui para obter mais informações sobre a lista de pips.
Exemplo:
$ pip show jupyter
Name: jupyter
Version: 1.0.0
Summary: Jupyter metapackage. Install all the Jupyter components in one go.
Home-page: http://jupyter.org
Author: Jupyter Development Team
Author-email: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel
pip.get_installed_distributions()
dará uma lista de pacotes instalados
import pip
from os.path import join
for package in pip.get_installed_distributions():
print(package.location) # you can exclude packages that's in /usr/XXX
print(join(package.location, package._get_metadata("top_level.txt"))) # root directory of this package
O abaixo é um pouco lento, mas fornece uma lista bem formatada de pacotes que pip
está ciente. Ou seja, nem todos eles foram instalados "por" pip, mas todos devem poder ser atualizados por pip.
$ pip search . | egrep -B1 'INSTALLED|LATEST'
A razão pela qual é lento é que lista o conteúdo de todo o repositório pypi. Eu enviei um ticket sugerindo pip list
uma funcionalidade semelhante, mas com mais eficiência.
Saída de amostra: (restringiu a pesquisa a um subconjunto em vez de '.' Para todos.)
$ pip search selenium | egrep -B1 'INSTALLED|LATEST'
selenium - Python bindings for Selenium
INSTALLED: 2.24.0
LATEST: 2.25.0
--
robotframework-selenium2library - Web testing library for Robot Framework
INSTALLED: 1.0.1 (latest)
$
Adicionando à resposta de @Paul Woolcock,
pip freeze > requirements.txt
criará um arquivo de requisitos com todos os pacotes instalados , juntamente com os números de versão instalados no ambiente ativo no local atual. Corrida
pip install -r requirements.txt
instalará os pacotes especificados no arquivo de requisitos.
As versões mais recentes do pip têm a capacidade de fazer o que o OP deseja via pip list -l
ou pip freeze -l
( --list
).
No Debian (pelo menos), a página de manual não deixa isso claro, e eu o descobri apenas - assumindo que o recurso deve existir - compip list --help
.
Existem comentários recentes que sugerem que esse recurso não é óbvio na documentação ou nas respostas existentes (embora sugeridas por alguns), então achei que deveria postar. Eu preferiria fazê-lo como um comentário, mas não tenho pontos de reputação.
pip freeze --local
por 8 anos. pip list --local
também está disponível ... mas observe que a pergunta do OP não é sobre ambientes virtuais (que --local
oferecem suporte), mas sobre discernir pacotes de distribuição de sudo pip install
pacotes.
Observe que, se você tiver várias versões do Python instaladas no seu computador, poderá ter algumas versões do pip associadas a cada uma.
Dependendo de suas associações, você pode ter muito cuidado com o comando pip usado:
pip3 list
Trabalhou para mim, onde estou executando o Python3.4. Simplesmente usando pip list
retornou o erro The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip
.
Como o @almenon apontou, isso não funciona mais e não é a maneira suportada de obter informações do pacote no seu código. A seguir, uma exceção:
import pip
installed_packages = dict([(package.project_name, package.version)
for package in pip.get_installed_distributions()])
Para fazer isso, você pode importar pkg_resources
. Aqui está um exemplo:
import pkg_resources
installed_packages = dict([(package.project_name, package.version)
for package in pkg_resources.working_set])
Estou dentro v3.6.5
Aqui está o one-liner para o fedora ou outras distribuições rpm (com base nas dicas @barraponto):
find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Anexe isso ao comando anterior para obter uma saída mais limpa:
| sed -r 's:.*/(\w+)/__.*:\1:'
Obtenha todos os nomes de arquivos / pastas site-packages/
(e, dist-packages/
se existir) e use o gerenciador de pacotes para remover os que foram instalados via pacote.
O pip freeze lista todos os pacotes instalados, mesmo que não seja pelo pip / easy_install. No CentOs / Redhat, é encontrado um pacote instalado através do rpm.
Se você usar a distribuição python do Anaconda , poderá usar o conda list
comando para ver o que foi instalado por qual método:
user@pc:~ $ conda list
# packages in environment at /anaconda3:
#
# Name Version Build Channel
_ipyw_jlab_nb_ext_conf 0.1.0 py36h2fc01ae_0
alabaster 0.7.10 py36h174008c_0
amqp 2.2.2 <pip>
anaconda 5.1.0 py36_2
anaconda-client 1.6.9 py36_0
Para pegar as entradas instaladas por pip
(inclusive possivelmente por pip
si):
user@pc:~ $ conda list | grep \<pip
amqp 2.2.2 <pip>
astroid 1.6.2 <pip>
billiard 3.5.0.3 <pip>
blinker 1.4 <pip>
ez-setup 0.9 <pip>
feedgenerator 1.9 <pip>
É claro que você provavelmente deseja selecionar apenas a primeira coluna, com a qual você pode fazer (excluindo, pip
se necessário):
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp
astroid
billiard
blinker
ez-setup
feedgenerator
Finalmente, você pode pegar esses valores e desinstalar todos eles usando o seguinte:
user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y
Observe o uso do -y
sinalizador para pip uninstall
evitar a confirmação da exclusão.
lista de pip [opções] Você pode ver a referência completa aqui
Pelo menos para o Ubuntu (talvez também para outros) funciona isso (inspirado em um post anterior neste tópico):
printf "Installed with pip:";
pip list 2>/dev/null | gawk '{print $1;}' | while read; do pip show "${REPLY}" 2>/dev/null | grep 'Location: /usr/local/lib/python2.7/dist-packages' >/dev/null; if (( $? == 0 )); then printf " ${REPLY}"; fi; done; echo