Trouver tous les packages installés avec easy_install / pip?

400

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

Jürgen A. Erhard
la source

Réponses:

381

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

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

TheodorosPloumis
la source
89
Depuis la version 1.3, la «liste pip» a été ajoutée. Voir ma réponse ci-dessous et les documents ici: pip-installer.org/en/latest/usage.html#pip-list
keybits
7
lister et figer différents formats de sortie (au moment de la rédaction). La sortie figée
Tom Saleeba
18
pip freezeet pip listlistez tout. Ils n'excluent pas les packages qui n'ont pas été installés par pip.
Eliad
Je trouve également pip freezefiable dans les scripts, alors pip listqu'il générera des erreurs inattendues lorsqu'il sera utilisé avec des tuyaux.
Dale Anderson
2
Le nouveau (?) pip list -lOu pip list --localest la meilleure réponse, voir stackoverflow.com/a/43012269/491884 par @MJB
jmuc
255

Depuis la version 1.3 de pip, vous pouvez maintenant utiliser pip list

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

touches
la source
3
Sur Gentoo, cela répertorie tous les packages, même ceux installés par d'autres moyens que pip. Est-ce que cela exclut vraiment les modules non pip installés sur un autre système comme demandé par la question?
jlh
Notez que cela est légèrement différent depip freeze
sg
1
pip list --useraffiche uniquement les packages installés par l'utilisateur et exclut les packages à l'échelle du système.
Jacob Hume
138

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

pip show [options] <package>

Cela répertorie le répertoire d'installation du package donné.

Daniel Sikes
la source
24

Si Debian se comporte comme les versions récentes d'Ubuntu concernant la pip installcible par défaut, c'est très simple: il s'installe à la /usr/local/lib/place de /usr/lib( aptcible par défaut). Vérifiez /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Je suis un utilisateur ArchLinux et comme j'ai expérimenté avec pip, j'ai rencontré ce 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 d'installation de pip, YMMV. pacman -Qoest la façon dont pac kage man ager d' Arch vérifie la propriété du fichier. No packagefait partie du retour , il donne quand aucun paquet est propriétaire du fichier: error: No package owns $FILENAME. Solution de contournement délicate: je pose des questions __init__.pyparce que je suis pacman -Qoun peu ignorant en ce qui concerne les répertoires :(

Pour le faire pour d'autres distributions, vous devez savoir où pipinstalle les trucs (juste sudo pip installquelque chose), comment interroger la propriété d'un fichier (la méthode Debian / Ubuntu l'est dpkg -S) et quel est le retour «aucun paquet ne possède ce chemin» (Debian / Ubuntu est no path found matching pattern). Utilisateurs Debian / Ubuntu, attention: dpkg -Séchouera si vous lui donnez un lien symbolique. Résolvez-le 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'
Capi Etheriel
la source
2
+1 Merci beaucoup pour le monoplace Arch, c'est exactement ce que je cherchais. Soit dit en passant, fait curieux: mon installation Arch est localisée en italien, mais grep correctement `` a salué '' les lignes qui disaient `` Nessun pacchetto '' (italien pour `` pas de paquet '') même si j'ai recherché `` pas de paquet ''. Comment venir?
Nadir Sampaoli
1
@barraponto @NadirSampaoli grep ne fait rien dans mon cas. Parce que grep essaie de grep dans stdout, mais dpkgécris l'erreur dans stderr donc je dois ajouter une redirection 2>&1. Et pour la sortie internationale, ajoutez LANG= devant xargs dpkg -s. et sedc'est aussi un bon outil;) pour ne garder que le nom du paquet du chemin. Je me retrouve donc avec: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
salut, j'ai rétrogradé cela par erreur et je viens juste de m'en rendre compte, et maintenant mon vote est bloqué. Quelqu'un pourrait-il voter pour neutraliser mon vote négatif? Merci
Jonathan
22

Commencer avec:

$ pip list

Pour répertorier tous les packages. Une fois que vous avez trouvé le package souhaité, utilisez:

$ pip show <package-name>

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

Cliquez ici pour plus d'informations sur le pip show et ici pour plus d'informations sur la liste des 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: jupyter@googlegroups.org
License: BSD
Location: /usr/local/lib/python2.7/site-packages
Requires: ipywidgets, nbconvert, notebook, jupyter-console, qtconsole, ipykernel    
ng10
la source
Meilleure réponse à mon humble avis. Vraiment simple et rapide si je connais le nom du paquet. la liste des pip n'est même pas nécessaire et le gel peut prendre beaucoup de temps et je dois filtrer les choses qui ne m'intéressent pas. Simple: pip show my_packge
ChuckZ
8

pip.get_installed_distributions() donnera une liste des packages 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
yegle
la source
2
Cela ne fonctionnera plus. Voir github.com/pypa/pip/issues/5243 À la place, vous devez utiliser: import pkg_resources [print (d.project_name) for d dans pkg_resources.working_set]
Almenon
6

Ce qui suit est un peu lent, mais il donne une liste de packages bien formatés qui pipsont au courant. C'est-à-dire que tous n'ont pas été installés "par" pip, mais tous devraient 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 repo pypi. J'ai déposé un ticket suggérant de pip listfournir 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)
$
MarkHu
la source
Pourquoi ne pas déposer le ticket vous-même?
lajarre
1
Apparemment, la prochaine version de pip aura une nouvelle commande list: pip-installer.org/en/latest/usage.html#pip-list
MarkHu
5

Ajoutant à la réponse de @Paul Woolcock,

pip freeze > requirements.txt

créera un fichier d'exigences avec tous les packages installés ainsi que les numéros de version installés dans l'environnement actif à l'emplacement actuel. Fonctionnement

pip install -r requirements.txt

va installer les packages spécifiés dans le fichier des exigences.

Tout est possible
la source
5

Les nouvelles versions de pip ont la possibilité de faire ce que l'OP veut via pip list -lou pip freeze -l( --list).
Sur Debian (au moins), la page de manuel ne le dit pas clairement, et je ne l'ai découvert - sous l'hypothèse que la fonctionnalité doit exister - qu'avec pip list --help.

Il y a des commentaires récents qui suggèrent que cette fonctionnalité n'est pas évidente dans la documentation ou les réponses existantes (bien que suggérées par certains), donc j'ai pensé que je devrais poster. J'aurais préféré le faire en commentaire, mais je n'ai pas les points de réputation.

MJB
la source
1
s'avère que nous avions pip freeze --localdepuis 8 ans. pip list --localest également disponible ... mais notez que la question OP ne concerne pas les environnements virtuels (qui le --localsupportent) mais le discernement des packages de distribution à partir des sudo pip installpackages.
Capi Etheriel
4

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

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

pip3 list 

A fonctionné pour moi, où j'utilise Python3.4. La simple utilisation a pip listrenvoyé l'erreur The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.

ntk4
la source
pip est pour python2.7, pip3 est pour python3.x
mjp
3

Comme l'a souligné @almenon, cela ne fonctionne plus et ce n'est pas le moyen pris en charge pour obtenir des informations sur le package dans votre code. Ce qui suit soulève 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 dessus v3.6.5

mscheker
la source
2

Voici le one-liner pour fedora ou autres distributions de tours (basé sur les conseils de @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:'
eddygeek
la source
1

Récupérez tous les noms de fichiers / dossiers site-packages/(et dist-packages/s'ils existent) et utilisez votre gestionnaire de packages pour supprimer ceux qui ont été installés via le package.

Ignacio Vazquez-Abrams
la source
1

pip freeze répertorie tous les packages installés même si ce n'est pas par pip / easy_install. Sur CentOs / Redhat, un package installé via rpm est trouvé.

user3013438
la source
1

Si vous utilisez la distribution python Anaconda , vous pouvez utiliser la conda listcommande pour voir ce qui a été installé par 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 piplui - 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 simplement sélectionner la première colonne, ce que vous pouvez faire (à l'exclusion pipsi 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 les désinstaller toutes en utilisant ce qui suit:

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

Notez l'utilisation du -ydrapeau pour pip uninstalléviter d'avoir à confirmer la suppression.

CS
la source
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]
Ed K
la source
0

Au moins pour Ubuntu (peut - être aussi d' autres) fonctionne ce (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
appuyez sur la touche
la source