¿Hay alguna manera de encontrar todos los paquetes Python PyPI que se instalaron con easy_install o pip? Quiero decir, excluir todo lo que se instaló / se instaló con las herramientas de distribución (en este caso, apt-get en Debian).
¿Hay alguna manera de encontrar todos los paquetes Python PyPI que se instalaron con easy_install o pip? Quiero decir, excluir todo lo que se instaló / se instaló con las herramientas de distribución (en este caso, apt-get en Debian).
Respuestas:
pip freeze
generará 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
pip freeze
y pip list
enumera todo. No excluyen los paquetes que no fueron instalados por pip
.
pip freeze
que es confiable en los scripts, mientras pip list
que generará errores inesperados cuando se usa con tuberías.
pip list -l
O pip list --local
es la mejor respuesta, consulte stackoverflow.com/a/43012269/491884 por @MJB
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/
pip freeze
pip list --user
solo muestra los paquetes instalados por el usuario y excluye los paquetes de todo el sistema.
Si alguien se pregunta, puede usar el comando 'pip show'.
pip show [options] <package>
Esto enumerará el directorio de instalación del paquete dado.
Si Debian se comporta como versiones recientes de Ubuntu con respecto al pip install
objetivo predeterminado, es muy fácil: se instala en /usr/local/lib/
lugar de /usr/lib
( apt
objetivo 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 -Qo
así es como el pac kage man ager de Arch verifica la propiedad del archivo. No package
es 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__.py
porque pacman -Qo
es un poco ignorante cuando se trata de directorios :(
Para hacerlo para otras distribuciones, debe averiguar dónde se pip
instalan las cosas (solo sudo pip install
algo), 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 -S
fallará 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'
dpkg
escribe 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 sed
tambié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/"
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
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
El siguiente es un poco lento, pero da una lista bien formateada de paquetes que pip
conoce. 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 list
proporcionar 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)
$
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.
Las versiones más recientes de pip tienen la capacidad de hacer lo que el OP quiere a través de pip list -l
o 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.
pip freeze --local
8 años. pip list --local
también está disponible ... pero tenga en cuenta que la pregunta OP no se trata de entornos virtuales (que son --local
compatibles) sino de discernir paquetes de distribución de sudo pip install
paquetes.
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 list
devolvió el error The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip
.
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
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:'
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.
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.
Si usa la distribución Python de Anaconda , puede usar el conda list
comando 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 pip
mismo):
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 pip
si 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 -y
bandera para pip uninstall
evitar tener que dar confirmación para eliminar.
pip list [opciones] Puede ver la referencia completa aquí
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