Alle mit easy_install / pip installierten Pakete finden?

400

Gibt es eine Möglichkeit, alle Python PyPI-Pakete zu finden, die mit easy_install oder pip installiert wurden? Ich meine, ausgenommen alles, was mit den Distributionstools installiert wurde / wird (in diesem Fall apt-get on Debian).

Jürgen A. Erhard
quelle

Antworten:

381

pip freezegibt eine Liste der installierten Pakete und ihrer Versionen aus. Außerdem können Sie diese Pakete in eine Datei schreiben, die später zum Einrichten einer neuen Umgebung verwendet werden kann.

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

TheodorosPloumis
quelle
89
Ab Version 1.3 wurde 'Pip List' hinzugefügt. Siehe meine Antwort unten und die Dokumente hier: pip-installer.org/en/latest/usage.html#pip-list
Keybits
7
Auflisten und Einfrieren verschiedener Ausgabeformate (zum Zeitpunkt des Schreibens). Die Freeze-Ausgabe kann verwendet werden, um Umgebungen neu zu erstellen: docs.python-guide.org/en/latest/dev/virtualenvs/#other-notes
Tom Saleeba
18
pip freezeund pip listalles auflisten. Sie schließen die Pakete nicht aus, die nicht von installiert wurden pip.
Eliad
Ich finde pip freezeauch in Skripten zuverlässig, während pip listbei der Verwendung mit Pipes unerwartete Fehler auftreten.
Dale Anderson
2
Das neue (?) pip list -lOder pip list --localist die beste Antwort, siehe stackoverflow.com/a/43012269/491884 von @MJB
jmuc
255

Ab Version 1.3 von pip können Sie jetzt verwenden pip list

Es bietet einige nützliche Optionen, einschließlich der Möglichkeit, veraltete Pakete anzuzeigen. Hier ist die Dokumentation: https://pip.pypa.io/en/latest/reference/pip_list/

Keybits
quelle
3
Auf Gentoo werden alle Pakete aufgelistet , auch diejenigen, die auf andere Weise als pip installiert wurden. Schließt dies wirklich nicht auf Pip installierte Module auf einem anderen System aus, wie in der Frage gefordert?
14.
Beachten Sie, dass dies etwas anders ist alspip freeze
sg
1
pip list --userZeigt nur vom Benutzer installierte Pakete an und schließt systemweite Pakete aus.
Jacob Hume
138

Wenn sich jemand wundert, können Sie den Befehl 'pip show' verwenden.

pip show [options] <package>

Dadurch wird das Installationsverzeichnis des angegebenen Pakets aufgelistet.

Daniel Sikes
quelle
24

Wenn sich Debian in Bezug auf das pip installStandardziel wie die neuesten Ubuntu-Versionen verhält , ist dies kinderleicht: Es wird /usr/local/lib/anstelle von /usr/lib( aptStandardziel) installiert . Überprüfen Sie /ubuntu/173323/how-do-i-detect-and-remove-python-packages-installed-via-pip/259747#259747

Ich bin ein ArchLinux-Benutzer und als ich mit pip experimentierte, stieß ich auf dasselbe Problem. So habe ich es in Arch gelöst.

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

Der Schlüssel hier ist /usr/lib/python2.7/site-packagesYMMV, das Verzeichnis, in das pip installiert wird. pacman -QoSo Bogen pac kage Mann für den Besitz der Datei ager überprüft. No packageist Teil der Rückgabe, die es gibt, wenn kein Paket die Datei besitzt : error: No package owns $FILENAME. Tricky Workaround: Ich frage nach, __init__.pyweil pacman -Qoes ein bisschen unwissend ist, wenn es um Verzeichnisse geht :(

Um dies für andere Distributionen zu tun, müssen Sie herausfinden, wo Dinge pipinstalliert werden (nur sudo pip installetwas), wie der Besitz einer Datei abgefragt wird (Debian / Ubuntu-Methode ist dpkg -S) und was die Rückgabe "Kein Paket besitzt diesen Pfad" (Debian) ist / Ubuntu ist no path found matching pattern). Debian / Ubuntu-Benutzer, Vorsicht: dpkg -SWird fehlschlagen, wenn Sie ihm einen symbolischen Link geben. Lösen Sie es einfach zuerst mit realpath. So was:

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

Fedora-Benutzer können es versuchen (danke @eddygeek):

find /usr/lib/python2.7/site-packages -maxdepth 2 -name __init__.py | xargs rpm -qf | grep 'not owned by any package'
Capi Etheriel
quelle
2
+1 Vielen Dank für den Arch Einzeiler, genau das habe ich gesucht. Übrigens eine merkwürdige Tatsache: Meine Arch-Installation ist auf Italienisch lokalisiert, aber grep hat die Zeilen mit der Aufschrift "Nessun pacchetto" (italienisch für "kein Paket") korrekt "gepackt", obwohl ich nach "kein Paket" geklopft habe. Woher?
Nadir Sampaoli
1
@barraponto @NadirSampaoli grep macht in meinem Fall nichts. Weil grep versucht, in stdout zu grep, aber dpkgschreibe den Fehler in stderr, so dass ich eine Umleitung hinzufügen muss 2>&1. Und für die internationale Ausgabe hinzufügen LANG= vor xargs dpkg -s. und sedist auch ein nettes Tool;) um nur den Paketnamen des Pfades zu behalten. Also ende ich mit: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
Hallo, ich habe dies versehentlich abgelehnt und es gerade erst erkannt, und jetzt ist meine Stimme gesperrt. Könnte jemand dies abstimmen, um meine Ablehnung zu neutralisieren? Danke
Jonathan
22

Beginnen mit:

$ pip list

Alle Pakete auflisten. Wenn Sie das gewünschte Paket gefunden haben, verwenden Sie:

$ pip show <package-name>

Dies zeigt Ihnen Details zu diesem Paket, einschließlich seines Ordners. Sie können den ersten Teil überspringen, wenn Sie den Paketnamen bereits kennen

Klicken Sie hier für weitere Informationen zur Pip-Show und hier für weitere Informationen zur Pip-Liste.

Beispiel:

$ 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
quelle
Beste Antwort IMHO. Wirklich einfach und schnell, wenn ich den Paketnamen kenne. Die Pip-Liste ist nicht einmal notwendig und das Einfrieren kann lange dauern und ich muss Dinge herausfiltern, die mir egal sind. Einfach: pip show my_packge
ChuckZ
8

pip.get_installed_distributions() gibt eine Liste der installierten Pakete

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
quelle
2
Das wird nicht mehr funktionieren. Siehe github.com/pypa/pip/issues/5243 Stattdessen sollten Sie verwenden: import pkg_resources [print (d.project_name) für d in pkg_resources.working_set]
Almenon
6

Das Folgende ist etwas langsam, aber es gibt eine schön formatierte Liste von Paketen, pipdie bekannt sind. Das heißt, nicht alle wurden "by" pip installiert, aber alle sollten per pip aufgerüstet werden können.

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

Der Grund dafür ist, dass es den Inhalt des gesamten Pypi-Repo auflistet. Ich habe ein Ticket eingereicht, das vorschlägt pip list, ähnliche Funktionen bereitzustellen, jedoch effizienter.

Beispielausgabe: (Die Suche wurde für alle auf eine Teilmenge anstelle von '.' Beschränkt.)

$ 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
quelle
Warum nicht das Ticket selbst einreichen?
Lajarre
1
Anscheinend wird die nächste Version von pip einen neuen Listenbefehl haben: pip-installer.org/en/latest/usage.html#pip-list
MarkHu
5

Hinzufügen zu @Paul Woolcocks Antwort,

pip freeze > requirements.txt

erstellt eine Anforderungsdatei mit allen installierten Paketen zusammen mit den installierten Versionsnummern in der aktiven Umgebung am aktuellen Speicherort. Laufen

pip install -r requirements.txt

installiert die in der Anforderungsdatei angegebenen Pakete.

Alles ist gut
quelle
5

Neuere Versionen von pip können über pip list -loder pip freeze -l( --list) tun, was das OP will .
Auf Debian (zumindest) macht die Manpage dies nicht klar, und ich habe es nur entdeckt - unter der Annahme, dass das Feature existieren muss - mit pip list --help.

Es gibt aktuelle Kommentare, die darauf hinweisen, dass diese Funktion weder in der Dokumentation noch in den vorhandenen Antworten offensichtlich ist (obwohl dies von einigen angedeutet wird), daher dachte ich, ich sollte etwas posten. Ich hätte es vorgezogen, dies als Kommentar zu tun, aber ich habe nicht die Reputationspunkte.

MJB
quelle
1
Es stellte sich heraus, dass wir seit pip freeze --local8 Jahren hatten. pip list --localist auch verfügbar ... aber beachten Sie, dass es bei der OP-Frage nicht um virtuelle Umgebungen (die --localunterstützt) geht, sondern darum, Distributionspakete von sudo pip installPaketen zu unterscheiden.
Capi Etheriel
4

Beachten Sie, dass bei mehreren auf Ihrem Computer installierten Python-Versionen möglicherweise einige Versionen von pip zugeordnet sind.

Abhängig von Ihren Assoziationen müssen Sie möglicherweise sehr vorsichtig sein, welchen Pip-Befehl Sie verwenden:

pip3 list 

Arbeitete für mich, wo ich Python3.4 ausführe. Einfach mit hat pip listden Fehler zurückgegeben The program 'pip' is currently not installed. You can install it by typing: sudo apt-get install python-pip.

ntk4
quelle
pip ist für python2.7, pip3 ist für python3.x
mjp
3

Wie @almenon hervorhob, funktioniert dies nicht mehr und es ist nicht die unterstützte Methode, um Paketinformationen in Ihrem Code abzurufen. Folgendes löst eine Ausnahme aus:

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

Um dies zu erreichen, können Sie importieren pkg_resources. Hier ist ein Beispiel:

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

Ich bin dran v3.6.5

mscheker
quelle
2

Hier ist der Einzeiler für Fedora oder andere RPM-Distributionen (basierend auf @ barraponto-Tipps):

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

Fügen Sie dies an den vorherigen Befehl an, um eine sauberere Ausgabe zu erhalten:

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

Holen Sie sich alle Datei- / Ordnernamen in site-packages/(und dist-packages/falls vorhanden) und entfernen Sie mit Ihrem Paketmanager diejenigen, die über das Paket installiert wurden.

Ignacio Vazquez-Abrams
quelle
1

pip freeze listet alle installierten Pakete auf, auch wenn dies nicht über pip / easy_install erfolgt. Auf CentOs / Redhat wird ein über rpm installiertes Paket gefunden.

user3013438
quelle
1

Wenn Sie die Anaconda- Python-Distribution verwenden, können Sie mit dem conda listBefehl sehen, was mit welcher Methode installiert wurde:

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

So greifen Sie auf die von pip(einschließlich möglicherweise pipselbst) installierten Einträge zu :

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>

Natürlich möchten Sie wahrscheinlich nur die erste Spalte auswählen, mit der Sie arbeiten können (außer pipbei Bedarf):

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

Schließlich können Sie diese Werte abrufen und alle mithilfe der folgenden Schritte deinstallieren:

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

Beachten Sie die Verwendung des -yFlags, um pip uninstallzu vermeiden, dass zum Löschen eine Bestätigung gegeben werden muss.

CS
quelle
1

Für diejenigen, die kein Pip installiert haben, habe ich dieses schnelle Skript auf Github gefunden (funktioniert mit Python 2.7.13):

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

Zumindest für Ubuntu (vielleicht auch andere) funktioniert dies (inspiriert von einem vorherigen Beitrag in diesem Thread):

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
Tastendruck
quelle