web-dev-qa-db-fra.com

Trouvez tous les paquets installés avec easy_install / pip?

Existe-t-il un moyen de trouver tous les Python PyPI installés avec easy_install ou pip? Je veux dire, excluant tout ce qui était/est installé avec les outils de distribution (dans ce cas, apt-get sur Debian).

374
Jürgen A. Erhard

pip freeze affichera une liste des packages installés et de leurs versions. Il vous permet également d'écrire ces packages dans un fichier qui pourra ensuite être utilisé pour configurer un nouvel environnement.

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

361
Paul Woolcock

À partir de la version 1.3 de pip, vous pouvez maintenant utiliser pip list

Il propose des options utiles, notamment la possibilité d'afficher des packages obsolètes. Voici la documentation: https://pip.pypa.io/en/latest/reference/pip_list/

241
keybits

Si quelqu'un se demande, vous pouvez utiliser la commande "pip show".

pip show [options] <package>

Ceci listera le répertoire d'installation du paquet donné.

132
Daniel Sikes

Si Debian se comporte comme les versions récentes d'Ubuntu en ce qui concerne la cible pip install par défaut, c'est très simple: elle s'installe sur /usr/local/lib/ au lieu de /usr/lib (apt cible par défaut). Vérifiez https://askubuntu.com/questions/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Je suis un utilisateur d’ArchLinux et lors de mes expériences avec pip, j’ai rencontré le même problème. Voici comment je l'ai résolu dans Arch.

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

La clé ici est /usr/lib/python2.7/site-packages, qui est le répertoire dans lequel pip installe, YMMV. pacman -Qo est comment l'arch pac kage man vérifie propriété du fichier. No package fait partie du retour qu'il donne lorsqu'aucun package ne possède le fichier: error: No package owns $FILENAME. Solution de contournement difficile: je pose une question sur __init__.py parce que pacman -Qo est un peu ignorant en ce qui concerne les répertoires :(

Pour pouvoir le faire pour d'autres distributions, vous devez savoir où pip installe des choses (juste Sudo pip install quelque chose), comment interroger la propriété d'un fichier (la méthode Debian/Ubuntu est dpkg -S ) et quel est le retour "aucun paquet ne possède ce chemin" (Debian/Ubuntu est no path found matching pattern). Utilisateurs de Debian/Ubuntu, méfiez-vous: dpkg -S échouera si vous lui attribuez un lien symbolique. Il suffit de le résoudre d'abord en utilisant realpath. Comme ça:

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

Les utilisateurs de Fedora peuvent essayer (merci @eddygeek):

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

Commencer avec:

$ pip list

Pour lister tous les paquets. Une fois que vous avez trouvé le paquet que vous voulez, utilisez:

$ pip show <package-name>

Cela vous montrera des détails sur ce paquet, y compris son dossier. Vous pouvez ignorer la première partie si vous connaissez déjà le nom du paquet.

Cliquez ici pour plus d'informations sur le spectacle de pip et ici pour plus d'informations sur la liste de pip.

Exemple:

$ 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: [email protected]
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    
16
ng10

Le texte ci-dessous est un peu lent, mais il donne une liste joliment formatée de paquets que pip est au courant. C'est-à-dire que tous n'ont pas été installés "par" pip, mais qu'ils devraient tous pouvoir être mis à niveau par pip.

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

La raison pour laquelle il est lent est qu’il répertorie le contenu de l’ensemble du rapport Pypi. J'ai déposé un ticket suggérant pip list fournir des fonctionnalités similaires mais plus efficacement.

Exemple de sortie: (restreint la recherche à un sous-ensemble au lieu de "." Pour tous.)

$ 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)
$
6
MarkHu

pip.get_installed_distributions() donnera une liste des paquets installés

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
5
yegle

Notez que si vous avez plusieurs versions de Python installées sur votre ordinateur, vous pouvez avoir quelques versions de pip associées à chacune d'elles.

Selon vos associations, vous devrez peut-être faire très attention à la commande pip que vous utilisez:

pip3 list 

Travaillé pour moi, où je cours Python3.4. Le simple fait d'utiliser pip list a renvoyé l'erreur The program 'pip' is currently not installed. You can install it by typing: Sudo apt-get install python-pip.

4
ntk4

Les versions les plus récentes de pip ont la capacité de faire ce que l’opérateur veut via liste de pip -l ou pip freeze -l. Sur Debian (au moins), la page de manuel n’explique pas cela clairement et je l’ai découverte - en supposant que la fonctionnalité doit exister - avec liste de pépins --help.

Des commentaires récents suggèrent que cette fonctionnalité n'est pas évidente dans la documentation ou dans les réponses existantes (bien que certains l'aient suggéré), alors j'ai pensé que je devrais poster. J'aurais préféré le faire comme commentaire, mais je n'ai pas les points de réputation.

3
MJB

Ajoutant à la réponse de @Paul Woolcock,

$ pip freeze > requirements.txt

créera un fichier de configuration avec tous les packages installés dans l'environnement actif à l'emplacement actuel que vous pouvez exécuter.

$ pip install -r requirements.txt

installer les exigences dans un autre environnement.

3

Voici le one-liner pour Fedora ou d'autres distributions rpm (basé sur les astuces @barraponto):

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

Ajoutez ceci à la commande précédente pour obtenir une sortie plus propre:

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

Comme @almenon l'a fait remarquer, cela ne fonctionne plus et ce n'est pas la méthode prise en charge pour obtenir des informations sur les packages dans votre code. Les éléments suivants soulèvent une exception:

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

Pour ce faire, vous pouvez importer pkg_resources. Voici un exemple:

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

Je suis sur v3.6.5

1
mscheker

pip freeze liste tous les paquets installés même si ce n’est pas pip/easy_install. Sur CentOs/Redhat, un paquet installé via rpm est trouvé.

1
user3013438

Si vous utilisez la distribution Anaconda python, vous pouvez utiliser la commande conda list pour voir ce qui a été installé avec quelle méthode:

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

Pour récupérer les entrées installées par pip (y compris éventuellement pip lui-même):

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>

Bien sûr, vous voudrez probablement juste sélectionner la première colonne, ce que vous pouvez faire avec (en excluant pip si nécessaire):

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

Enfin, vous pouvez récupérer ces valeurs et pip tout désinstaller à l’aide des éléments suivants:

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

Notez l'utilisation de l'indicateur -y pour le pip uninstall afin d'éviter de devoir donner une confirmation de suppression.

1
C S

Obtenez tous les noms de fichiers/dossiers dans site-packages/ (et dist-packages/ s'il existe), et utilisez votre gestionnaire de paquets pour supprimer ceux qui ont été installés via le paquet.

1

Pour ceux qui n'ont pas installé pip, j'ai trouvé ce script rapide sur github (fonctionne avec Python 2.7.13):

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

Au moins pour Ubuntu (peut-être aussi d'autres), cela fonctionne (inspiré d'un précédent post dans ce fil):

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
0
keypress