¿Encuentra todos los paquetes instalados con easy_install / pip?


Respuestas:


381

pip freezegenerará una lista de paquetes instalados y sus versiones. También le permite escribir esos paquetes en un archivo que luego puede usarse para configurar un nuevo entorno.

https://pip.pypa.io/en/stable/reference/pip_freeze/#pip-freeze


89
A partir de la versión 1.3, se ha agregado 'lista de pip'. Vea mi respuesta a continuación y los documentos aquí: pip-installer.org/en/latest/usage.html#pip-list
keybits

77
Enumerar y congelar los diferentes formatos de salida (al momento de la escritura). La salida de congelación se puede usar para recrear entornos: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba

18
pip freezey pip listenumera todo. No excluyen los paquetes que no fueron instalados por pip.
Eliad

También encuentro pip freezeque es confiable en los scripts, mientras pip listque generará errores inesperados cuando se usa con tuberías.
Dale Anderson el

2
El nuevo (?) pip list -lO pip list --locales la mejor respuesta, consulte stackoverflow.com/a/43012269/491884 por @MJB
jmuc

255

A partir de la versión 1.3 de pip ahora puede usar pip list

Tiene algunas opciones útiles, incluida la capacidad de mostrar paquetes obsoletos. Aquí está la documentación: https://pip.pypa.io/en/latest/reference/pip_list/


3
En Gentoo, esto enumera todos los paquetes, incluso los instalados por otros medios que no sean pip. ¿Esto realmente excluye los módulos instalados sin pip en otro sistema según lo solicitado por la pregunta?
jlh

Tenga en cuenta que esto es ligeramente diferente depip freeze
sg

1
pip list --usersolo muestra los paquetes instalados por el usuario y excluye los paquetes de todo el sistema.
Jacob Hume

138

Si alguien se pregunta, puede usar el comando 'pip show'.

pip show [options] <package>

Esto enumerará el directorio de instalación del paquete dado.


24

Si Debian se comporta como versiones recientes de Ubuntu con respecto al pip installobjetivo predeterminado, es muy fácil: se instala en /usr/local/lib/lugar de /usr/lib( aptobjetivo predeterminado). Verifique /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Soy un usuario de ArchLinux y cuando experimenté con pip me encontré con este mismo problema. Así es como lo resolví en Arch.

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs pacman -Qo | grep 'No package'

La clave aquí es /usr/lib/python2.7/site-packages, que es el directorio donde se instala pip, YMMV. pacman -Qoasí es como el pac kage man ager de Arch verifica la propiedad del archivo. No packagees parte de la declaración se da cuando no hay paquete pertenece el archivo: error: No package owns $FILENAME. Solución alternativa: estoy haciendo consultas __init__.pyporque pacman -Qoes un poco ignorante cuando se trata de directorios :(

Para hacerlo para otras distribuciones, debe averiguar dónde se pipinstalan las cosas (solo sudo pip installalgo), cómo consultar la propiedad de un archivo (el método Debian / Ubuntu es dpkg -S) y cuál es el retorno "ningún paquete posee esa ruta" (Debian / Ubuntu es no path found matching pattern). Usuarios de Debian / Ubuntu, cuidado: dpkg -Sfallará si le das un enlace simbólico. Solo resuélvelo primero usando realpath. Me gusta esto:

find /usr/local/lib/python2.7/dist-packages -maxdepth 2 -name __init__.py | xargs realpath | xargs dpkg -S 2>&1 | grep 'no path found'

Los usuarios de Fedora pueden probar (gracias @eddygeek):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

2
+1 Muchas gracias por el One-liner de Arch, eso es exactamente lo que estaba buscando. Por cierto, hecho curioso: mi instalación de Arch está localizada en italiano, pero grep correctamente 'agarró' las líneas que decían 'Nessun pacchetto' (italiano para 'Sin paquete') a pesar de que agarré 'Sin paquete'. ¿Cómo?
Nadir Sampaoli

1
@barraponto @NadirSampaoli grep no hace nada en mi caso. Porque grep intenta grep en stdout, pero dpkgescribe el error en stderr, así que tengo que agregar una redirección 2>&1. Y para la producción internacional agregue LANG= delante de xargs dpkg -s. y sedtambién es una buena herramienta;) para mantener solo el nombre del paquete de la ruta. Así que termino con: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

1
hola, rechacé esto por error y solo me di cuenta, y ahora mi voto está bloqueado. ¿Podría alguien votar esto para neutralizar mi voto negativo? Gracias
Jonathan

22

Empezar con:

$ pip list

Para enumerar todos los paquetes. Una vez que encuentre el paquete que desea, use:

$ pip show <package-name>

Esto le mostrará detalles sobre este paquete, incluida su carpeta. Puede omitir la primera parte si ya conoce el nombre del paquete

Haga clic aquí para obtener más información sobre pip show y aquí para obtener más información sobre la lista de pip.

Ejemplo:

$ 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    

La mejor respuesta en mi humilde opinión. Realmente simple y rápido si sé el nombre del paquete. la lista de pips ni siquiera es necesaria y congelar puede llevar mucho tiempo y tengo que filtrar cosas que no me importan. Simple: pip show my_packge
ChuckZ

8

pip.get_installed_distributions() le dará una lista de paquetes 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
Esto ya no funcionará. Consulte github.com/pypa/pip/issues/5243. En su lugar, debe usar: import pkg_resources [print (d.project_name) for d in pkg_resources.working_set]
Almenon

6

El siguiente es un poco lento, pero da una lista bien formateada de paquetes que pipconoce. Es decir, no todos fueron instalados "por" pip, pero todos deberían poder actualizarse por pip.

$ pip search . | egrep -B1 'INSTALLED|LATEST'

La razón por la que es lenta es que enumera el contenido de todo el repositorio de pipi. Presenté un ticket sugiriendo pip listproporcionar una funcionalidad similar pero más eficiente.

Salida de muestra: (restringió la búsqueda a un subconjunto en lugar 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 qué no presentar el boleto usted mismo?
lajarre

1
Aparentemente, la próxima versión de pip tendrá un nuevo comando de lista: pip-installer.org/en/latest/usage.html#pip-list
MarkHu

5

Agregando a la respuesta de @Paul Woolcock,

pip freeze > requirements.txt

creará un archivo de requisitos con todos los paquetes instalados junto con los números de versión instalados en el entorno activo en la ubicación actual. Corriendo

pip install -r requirements.txt

instalará los paquetes especificados en el archivo de requisitos.


5

Las versiones más recientes de pip tienen la capacidad de hacer lo que el OP quiere a través de pip list -lo pip freeze -l( --list).
En Debian (al menos) la página del manual no deja esto claro, y solo lo descubrí, bajo el supuesto de que la característica debe existir, con pip list --help.

Hay comentarios recientes que sugieren que esta característica no es obvia ni en la documentación ni en las respuestas existentes (aunque algunos lo insinúan), así que pensé que debería publicar. Hubiera preferido hacerlo como un comentario, pero no tengo los puntos de reputación.


1
Resulta que tuvimos pip freeze --local8 años. pip list --localtambién está disponible ... pero tenga en cuenta que la pregunta OP no se trata de entornos virtuales (que son --localcompatibles) sino de discernir paquetes de distribución de sudo pip installpaquetes.
Capi Etheriel

4

Tenga en cuenta que si tiene varias versiones de Python instaladas en su computadora, puede tener algunas versiones de pip asociadas con cada una.

Dependiendo de sus asociaciones, es posible que tenga que ser muy cuidadoso con el comando pip que utiliza:

pip3 list 

Funcionó para mí, donde estoy ejecutando Python3.4. Simplemente usando pip listdevolvió el error The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.


pip es para python2.7, pip3 es para python3.x
mjp

3

Como señaló @almenon, esto ya no funciona y no es la forma compatible de obtener información del paquete en su código. Lo siguiente plantea una excepción:

import pip
installed_packages = dict([(package.project_name, package.version) 
                           for package in pip.get_installed_distributions()])

Para lograr esto, puede importar pkg_resources. Aquí hay un ejemplo:

import pkg_resources
installed_packages = dict([(package.project_name, package.version)
                           for package in pkg_resources.working_set])

Estoy en v3.6.5


2

Aquí está el one-liner para fedora u otras distribuciones de rpm (basado en los consejos de @barraponto):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'

Agregue esto al comando anterior para obtener una salida más limpia:

 | sed -r 's:.*/(\w+)/__.*:\1:'

1

Obtenga todos los nombres de archivo / carpeta site-packages/(y dist-packages/si existe), y use su administrador de paquetes para quitar los que se instalaron a través del paquete.


1

pip freeze enumera todos los paquetes instalados, incluso si no es por pip / easy_install. En CentOs / Redhat se encuentra un paquete instalado a través de rpm.


1

Si usa la distribución Python de Anaconda , puede usar el conda listcomando para ver qué se instaló con qué 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 tomar las entradas instaladas por pip(incluido posiblemente él pipmismo):

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>

Por supuesto, probablemente solo desee seleccionar la primera columna, que puede hacer con (excluyendo pipsi es necesario):

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}'
amqp        
astroid
billiard
blinker
ez-setup
feedgenerator 

Finalmente, puede tomar estos valores y desinstalarlos todos usando lo siguiente:

user@pc:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

Tenga en cuenta el uso de la -ybandera para pip uninstallevitar tener que dar confirmación para eliminar.


1

Para aquellos que no tienen pip instalado, encontré este script rápido en github (funciona con Python 2.7.13):

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


0

Al menos para Ubuntu (tal vez también otros) funciona esto (inspirado en una publicación anterior en este hilo):

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.