Wie liste ich alle installierten Pakete und ihre Versionen in Python auf?

128

Gibt es in Python eine Möglichkeit, alle installierten Pakete und ihre Versionen aufzulisten?

Ich weiß, dass ich hineingehen python/Lib/site-packagesund sehen kann, welche Dateien und Verzeichnisse existieren, aber ich finde das sehr umständlich. Was ich suche nach etwas, das ähnlich ist , npm listdh NPM-ls .

jsalonen
quelle

Antworten:

196

Wenn Sie pip installiert haben und sehen möchten, welche Pakete mit Ihren Installationswerkzeugen installiert wurden, können Sie dies einfach aufrufen:

pip freeze

Es enthält auch Versionsnummern für die installierten Pakete.

Aktualisieren

pip wurde aktualisiert, um auch die gleiche Ausgabe wie pip freezebeim Aufruf von zu erzeugen :

pip list

Hinweis

Die Ausgabe von pip listist anders formatiert. Wenn Sie also ein Shell-Skript haben, das die Ausgabe von analysiert (möglicherweise um die Versionsnummer zu ermitteln), freezeund Ihr Skript so ändern möchten, dass es aufgerufen wird list, müssen Sie Ihren Parsing-Code ändern.

Jeff LaFay
quelle
9
IMHO sollten sie pip listals Alias ​​für bereitstellen pip freeze. Es ist intuitiv zu schreiben pip freeze > requirements.txt, aber nicht pip freeze.
jsalonen
3
WOW: Ich habe mir gerade die Dokumentation der neuesten Version von pip angesehen und sie scheinen hinzugefügt zu haben pip list: pip-installer.org/en/latest/usage.html#pip-list - das ist also tatsächlich etwas, das bereits kommt!
Jsalonen
51

help('modules') sollte es für dich tun.

in IPython:

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath
Ashwini Chaudhary
quelle
5
Das ist praktisch! Ich würde aber auch gerne die Versionen sehen.
jsalonen
4
Ich denke , das Problem Theres keine Möglichkeit , einschließlich der Version standardisiert ist ... manchmal sein Package.version()oder package.__version__oder package.veroder eine beliebige Anzahl anderer Möglichkeiten
Joran Beasley
Ich dachte das Python Motto wäre "es gibt nur einen Weg es zu tun";)?
Ed Randall
3
@EdRandall, nein - es ist "ein offensichtlicher Weg, es zu tun". Es gibt immer einen nicht offensichtlichen Weg. Der genaue Wortlaut lautet außerdem: Es sollte einen - und vorzugsweise nur einen - offensichtlichen Weg geben, dies zu tun. Obwohl dieser Weg zunächst vielleicht nicht offensichtlich ist, es sei denn, Sie sind Niederländer.
Rosuav
30

Wenn Sie Informationen zu Ihren installierten Python-Distributionen erhalten möchten und nicht Ihre Cmd-Konsole oder Ihr Terminal dafür verwenden möchten, sondern über Python-Code, können Sie den folgenden Code verwenden (getestet mit Python 3.4):

import pip #needed to use the pip functions
for i in pip.get_installed_distributions(local_only=True):
    print(i)

Der pip.get_installed_distributions(local_only=True)Funktionsaufruf gibt eine Iterable zurück und aufgrund der for-Schleife und der Druckfunktion werden die in der Iterable enthaltenen Elemente durch neue Zeilenzeichen ( \n) getrennt ausgedruckt . Das Ergebnis sieht (abhängig von Ihren installierten Distributionen) ungefähr so ​​aus:

cycler 0.9.0
decorator 4.0.4
ipykernel 4.1.0
ipython 4.0.0
ipython-genutils 0.1.0
ipywidgets 4.0.3
Jinja2 2.8
jsonschema 2.5.1
jupyter 1.0.0
jupyter-client 4.1.1
#... and so on...
eisig
quelle
4
Um den Kommentar von @ exhuma zu erweitern, sollten Sie mit pip 10 Folgendes verwenden: import pkg_resources [print (d.project_name) für d in pkg_resources.working_set]
Almenon
Wie ist der Zustand pkg_resources? AFAICR das ist ein Teil von setuptools. Nicht pip. Können wir sicher davon ausgehen , dass setuptoolsnur immer ehen je nach zur Verfügung stehen wird pip?
Exhuma
9

Sie können versuchen: Eigelb

Versuchen Sie zum Installieren von Eigelb:

easy_install yolk

Yolk ist ein Python-Tool zum Abrufen von Informationen zu installierten Python-Paketen und zum Abfragen von Paketen, die auf PyPI (Python Package Index) verfügbar sind.

Sie können sehen, welche Pakete aktiv, nicht aktiv oder im Entwicklungsmodus sind, und Ihnen zeigen, welche neueren Versionen verfügbar sind, indem Sie PyPI abfragen.

llazzaro
quelle
Normalerweise verwende ich zu diesem Zeitpunkt pip für diese Aufgabe, aber ich habe ein sehr altes Projekt, in das ich noch keine Distribution hinzufügen möchte, und ich erinnerte mich, dass es da draußen ein solches Tool gab. Ich konnte mich nicht erinnern, wie es hieß ... Das war es!
Meshantz
1
Es unterstützt nicht Python 3 (nur von Pip installiert und hat Laufzeitfehler)
Ohad Cohen
9

pip==10.0.1Verwenden Sie Folgendes, um dies in späteren Versionen von pip (getestet am ) auszuführen :

from pip._internal.operations.freeze import freeze
for requirement in freeze(local_only=True):
    print(requirement)
Exhuma
quelle
Wie ist der Status von intern?. Ich sehe, pydoc pip._internalaber ich kann es nicht erreichen help(pip._internal), Pip .__ Builtins_ usw. Pip Referenzhandbuch ist auch leer.
MortenB
1
Leider weiß ich es nicht. Ich mag es auch nicht, wenn es genannt wird _internal. Es scheint, dass die Funktionalität nicht offiziell verfügbar ist. Sie sollten also vorsichtig damit umgehen!
Exhuma
8

von der Kommandozeile

python -c help('modules')

kann verwendet werden, um alle Module und für bestimmte Module anzuzeigen

python -c help('os')

Für Linux wird unten funktionieren

python -c "help('os')"
Npradhan
quelle
5
Dies funktioniert unter Windows. Unter Linux wird ein Fehler -bash: syntax error near unexpected token `('
ausgegeben
Dies gibt keine Modulversionen
Stepan
5

Ja! Sie sollten pip als Python-Paketmanager verwenden ( http://pypi.python.org/pypi/pip ).

Mit pip installierten Paketen können Sie a

pip freeze

und es werden alle installierten Pakete aufgelistet. Sie sollten wahrscheinlich auch virtualenv und virtualenvwrapper verwenden . Wenn Sie ein neues Projekt starten, können Sie dies tun

mkvirtualenv my_new_project

und dann (innerhalb dieser virtuellen Umgebung) tun

pip install all_your_stuff

Auf diese Weise können Sie workon my_new_projectund dann , pip freezeum zu sehen , welche Pakete für das virtualenv / Projekt installiert sind.

beispielsweise:

  ~  mkvirtualenv yo_dude
New python executable in yo_dude/bin/python
Installing setuptools............done.
Installing pip...............done.
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/aaylward/dev/virtualenvs/yo_dude/bin/get_env_details

(yo_dude)➜  ~  pip install django
Downloading/unpacking django
  Downloading Django-1.4.1.tar.gz (7.7Mb): 7.7Mb downloaded
  Running setup.py egg_info for package django

Installing collected packages: django
  Running setup.py install for django
    changing mode of build/scripts-2.7/django-admin.py from 644 to 755

    changing mode of /Users/aaylward/dev/virtualenvs/yo_dude/bin/django-admin.py to 755
Successfully installed django
Cleaning up...

(yo_dude)➜  ~  pip freeze
Django==1.4.1
wsgiref==0.1.2

(yo_dude)➜  ~  

oder wenn Sie ein Python-Paket mit einer request.pip-Datei haben,

mkvirtualenv my_awesome_project
pip install -r requirements.pip
pip freeze

wird den Trick machen

Andbdrew
quelle
Oh ja, ich benutze virtualenv schon seit einiger Zeit. Ich weiß nur nicht, wie ich nicht herausgefunden habe, dass ich pipes auf diese Weise verwenden kann!
jsalonen
Über virtualenvmit globalen Site-Paketen müssen Sie dann verwenden pip list --local.
Ioannis Filippidis
@johntx Sie sollten niemals globale Site-Pakete verwenden!
Andbdrew
Die Verwendung globaler Site-Pakete ist sehr nützlich. Wenn dies nicht der Fall wäre, würde die Option in überhaupt nicht existieren virtualenv. Mir ist kein Grund bekannt, sie nicht zu verwenden, und niemand hindert Sie daran, sich auf isoliert zu beschränken, virtualenvwenn Sie dies vorziehen.
Ioannis Filippidis
Ein guter Grund, sie nicht zu verwenden, besteht darin, dass andere Personen / Server beim Verteilen oder Bereitstellen Ihrer App oder Ihres Programms nicht über Ihre globalen Site-Pakete verfügen. Wenn Sie die einzige Person sind, die die App verwendet, tun Sie, was Sie wollen.
Andbdrew
5

Meine Einstellung:

#!/usr/bin/env python3

import pkg_resources

dists = [str(d).replace(" ","==") for d in pkg_resources.working_set]
for i in dists:
    print(i)
Alfredocambera
quelle
2

Hier ist eine Möglichkeit, dies PYTHONPATHanstelle des absoluten Pfads Ihres Python libs-Verzeichnisses zu tun :

for d in `echo "${PYTHONPATH}" | tr ':' '\n'`; do ls "${d}"; done

[ 10:43 Jonathan@MacBookPro-2 ~/xCode/Projects/Python for iOS/trunk/Python for iOS/Python for iOS ]$ for d in `echo "$PYTHONPATH" | tr ':' '\n'`; do ls "${d}"; done
libpython2.7.dylib pkgconfig          python2.7
BaseHTTPServer.py      _pyio.pyc              cgitb.pyo              doctest.pyo            htmlentitydefs.pyc     mimetools.pyc          plat-mac               runpy.py               stringold.pyc          traceback.pyo
BaseHTTPServer.pyc     _pyio.pyo              chunk.py               dumbdbm.py             htmlentitydefs.pyo     mimetools.pyo          platform.py            runpy.pyc              stringold.pyo          tty.py
BaseHTTPServer.pyo     _strptime.py           chunk.pyc              dumbdbm.pyc            htmllib.py             mimetypes.py           platform.pyc           runpy.pyo              stringprep.py          tty.pyc
Bastion.py             _strptime.pyc          chunk.pyo              dumbdbm.pyo            htmllib.pyc            mimetypes.pyc          platform.pyo           sched.py               stringprep.pyc         tty.pyo
Bastion.pyc            _strptime.pyo          cmd.py
....
chown
quelle
0

Wenn dies erforderlich ist, um in Python ausgeführt zu werden, können Sie einfach den Unterprozess aufrufen

from subprocess import PIPE, Popen

pip_process = Popen(["pip freeze"], stdout=PIPE,
                   stderr=PIPE, shell=True)
stdout, stderr = pip_process.communicate()
print(stdout.decode("utf-8"))
Juftin
quelle