Encontre todos os pacotes instalados com o easy_install / pip?


Respostas:


381

pip freezeproduzirá 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


89
A partir da versão 1.3, 'lista de pip' foi adicionada. Veja minha resposta abaixo e os docs aqui: pip-installer.org/en/latest/usage.html#pip-list
keybits

7
listar e congelar os diferentes formatos de saída (até o momento da redação). A saída de congelamento pode ser usada para recriar ambientes: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba

18
pip freezee pip listliste tudo. Eles não excluem os pacotes que não foram instalados por pip.
Eliad

Eu também acho pip freezeque é confiável em scripts, enquanto pip listgera erros inesperados ao ser usado com pipes.
Dale Anderson

2
O novo (?) pip list -lOu pip list --localé a melhor resposta, consulte stackoverflow.com/a/43012269/491884 por @MJB
jmuc

255

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/


3
No Gentoo, isso lista todos os pacotes, mesmo aqueles instalados por outros meios que não o pip. Isso realmente exclui módulos instalados sem pip em outro sistema, conforme solicitado pela pergunta?
jlh

Observe que isso é um pouco diferente depip freeze
sg

11
pip list --usermostra apenas pacotes instalados pelo usuário e exclui pacotes de todo o sistema.
Jacob Hume

138

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.


24

Se o Debian se comporta como as versões recentes do Ubuntu em relação ao pip installdestino padrão, é fácil: ele é instalado em /usr/local/lib/vez de /usr/lib( aptdestino 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__.pyporque pacman -Qoé um pouco ignorante quando se trata de diretórios :(

Para fazer isso em outras distros, você precisa descobrir onde as pipcoisas são instaladas (apenas sudo pip installalgo), 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 -Sfalhará 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'

2
+1 Muito obrigado pela one-liner do Arch, era exatamente isso que eu estava procurando. A propósito, fato curioso: minha instalação do Arch está localizada em italiano, mas o grep corretamente 'grepped' as linhas que diziam 'Nessun pacchetto' (italiano para 'No package'), mesmo que eu tenha feito a solicitação para 'No package'. Por quê?
Nadir Sampaoli

11
@barraponto @NadirSampaoli grep não faz nada no meu caso. Porque grep tente grep em stdout, mas dpkgescreva 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 sedtambé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/"
David Boho

11
oi, votei isso por engano e acabei de perceber, e agora meu voto está bloqueado. Alguém poderia votar nisso para neutralizar meu voto negativo? Obrigado
Jonathan

22

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    

Melhor resposta IMHO. Realmente simples e rápido se eu souber o nome do pacote. A lista de pips nem é necessária e o congelamento pode levar muito tempo e eu tenho que filtrar coisas que não me interessam. Simples: pip show de my_packge
ChuckZ

8

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

2
Isso não funcionará mais. Veja github.com/pypa/pip/issues/5243 Em vez disso você deve usar: pkg_resources importação [de impressão (d.project_name) para d em pkg_resources.working_set]
Almenon

6

O abaixo é um pouco lento, mas fornece uma lista bem formatada de pacotes que pipestá 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 listuma 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)
$

Por que não arquivar o ticket você mesmo?
Lajarre

11
Aparentemente, a próxima versão do pip terá um novo comando de lista: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

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.


5

As versões mais recentes do pip têm a capacidade de fazer o que o OP deseja via pip list -lou 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.


11
Acontece que tivemos pip freeze --localpor 8 anos. pip list --localtambém está disponível ... mas observe que a pergunta do OP não é sobre ambientes virtuais (que --localoferecem suporte), mas sobre discernir pacotes de distribuição de sudo pip installpacotes.
Capi Etheriel

4

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 listretornou o erro The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.


pip é para python2.7, PIP3 é para python3.x
mjp

3

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


2

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:'

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.


1

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.


1

Se você usar a distribuição python do Anaconda , poderá usar o conda listcomando 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 pipsi):

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, pipse 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 -ysinalizador para pip uninstallevitar a confirmação da exclusão.


1

Para aqueles que não possuem o pip instalado, encontrei este script rápido no github (funciona com o Python 2.7.13):

import pkg_resources
distros = pkg_resources.AvailableDistributions()
for key in distros:
  print distros[key]


0

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