web-dev-qa-db-de.com

Alle Pakete finden, die mit easy_install / pip installiert wurden?

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

374

pip freeze gibt eine Liste der installierten Pakete und ihrer Versionen aus. Sie können diese Pakete auch 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

361
Paul Woolcock

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

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/

241
keybits

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

pip show [options] <package>

Dies listet das Installationsverzeichnis des angegebenen Pakets auf.

132
Daniel Sikes

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

Ich bin ein ArchLinux-Benutzer und als ich mit pip experimentiert habe, bin ich auf dasselbe Problem gestoßen. Hier ist, wie ich es in Arch gelöst habe.

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-packages, das ist das Verzeichnis, in das der Pip YMMV installiert. pacman -Qo ist, wie Archs pac kage man ager überprüft Eigentum an der Datei. No package ist Teil der Rückgabe, die es gibt, wenn kein Paket die Datei besitzt: error: No package owns $FILENAME. Problemumgehung: Ich frage nach __init__.py, da pacman -Qo in Bezug auf Verzeichnisse ein wenig ignorant ist :(

Um dies für andere Distributionen zu tun, müssen Sie herausfinden, wo pip etwas installiert (nur Sudo pip install), wie Sie den Besitz einer Datei abfragen (Debian/Ubuntu-Methode ist dpkg -S). ) und was ist die "no package owns that path" -Rückgabe (Debian/Ubuntu ist no path found matching pattern). Debian/Ubuntu-Benutzer, Vorsicht: dpkg -S schlägt fehl, wenn Sie ihm einen symbolischen Link geben. Beheben 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 versuchen (danke @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

Beginnen mit:

$ pip list

Um alle Pakete aufzulisten. Sobald 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 auf hier , um weitere Informationen zur Pip-Show zu erhalten, und auf hier , um weitere Informationen zur Pip-Liste zu erhalten.

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

Das Folgende ist etwas langsam, aber es gibt eine schön formatierte Liste von Paketen, die pip kennt. Das heißt, nicht alle von ihnen wurden von Pip installiert, aber alle sollten von Pip aufgerüstet werden können.

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

Der Grund, warum es langsam ist, ist, dass es den Inhalt des gesamten Pypi-Repos auflistet. Ich habe ein Ticket eingereicht, das pip list vorschlägt, ähnliche Funktionen bereitzustellen, aber effizienter.

Beispielausgabe: (Beschränkte die Suche auf eine Teilmenge anstelle von '.' Für alle.)

$ 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() zeigt eine Liste der installierten Pakete an

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

Beachten Sie, dass bei mehreren auf Ihrem Computer installierten Versionen von Python möglicherweise ein paar 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 laufen lasse. Durch einfaches Verwenden von pip list wurde der Fehler The program 'pip' is currently not installed. You can install it by typing: Sudo apt-get install python-pip zurückgegeben.

4
ntk4

Neuere Versionen von pip haben die Möglichkeit, mit pip list -l oder pip freeze -l das zu tun, was das OP will. Unter 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 hindeuten, dass diese Funktion weder in der Dokumentation noch in den vorhandenen Antworten offensichtlich ist (obwohl von einigen angedeutet), daher dachte ich, ich sollte posten. Ich hätte es als Kommentar vorgezogen, aber ich habe nicht die Reputationspunkte.

3
MJB

Zur Antwort von @Paul Woolcock hinzufügen,

$ pip freeze > requirements.txt

erstellt eine Anforderungsdatei mit allen installierten Paketen in der aktiven Umgebung am aktuellen Speicherort, die Sie ausführen können

$ pip install -r requirements.txt

um die Anforderungen in einer anderen Umgebung zu installieren.

3

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'

Hängen Sie dies an den vorherigen Befehl an, um eine sauberere Ausgabe zu erhalten:

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

Wie @almenon betonte, funktioniert dies nicht mehr und es ist nicht die unterstützte Methode, 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()])

Dazu können Sie pkg_resources importieren. Hier ist ein Beispiel:

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

Ich bin bei v3.6.5

1
mscheker

pip freeze listet alle installierten Pakete auf, auch wenn dies nicht mit pip/easy_install geschehen ist. Auf CentOs/Redhat wird ein Paket gefunden, das über rpm installiert wurde.

1
user3013438

Wenn Sie die Distribution Anaconda python verwenden, können Sie mit dem Befehl conda list feststellen, was mit welcher Methode installiert wurde:

[email protected]:~ $ 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 Einträge zu, die von pip installiert wurden (einschließlich möglicherweise pip selbst):

[email protected]:~ $ 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 (mit Ausnahme von pip, falls erforderlich):

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

Abschließend können Sie diese Werte abrufen und mit den folgenden Schritten alle deinstallieren:

[email protected]:~ $ conda list | awk '$3 ~ /pip/ {if ($1 != "pip") print $1}' | xargs pip uninstall -y

Beachten Sie die Verwendung des Flags -y für pip uninstall, um zu vermeiden, dass zum Löschen eine Bestätigung erforderlich ist.

1
C S

Rufen Sie alle Datei-/Ordnernamen in site-packages/ (und dist-packages/, falls vorhanden) ab und verwenden Sie Ihren Paketmanager, um diejenigen zu entfernen, die über das Paket installiert wurden.

Für diejenigen, die pip nicht installiert haben, fand ich dieses schnelle Skript unter github (funktioniert mit Python 2.7.13):

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

Zumindest für Ubuntu (vielleicht auch für andere) funktioniert dies (inspiriert von einem vorherigen post 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
0
keypress