Finden Sie heraus, welche Version des Pakets mit pip installiert ist

709

Ist es mit pip möglich herauszufinden, welche Version eines Pakets derzeit installiert ist?

Ich weiß davon, pip install XYZ --upgradeaber ich frage mich, ob es so etwas gibt pip info XYZ. Wenn nicht, was wäre der beste Weg, um festzustellen, welche Version ich gerade verwende.

Alexis
quelle
4
Es gibt einen Vorschlag für einen showBefehl in pip: github.com/pypa/pip/issues/33
Hugo Tavares

Antworten:

1013

Ab Pip 1.3 gibt es einen pip showBefehl.

$ pip show Jinja2
---
Name: Jinja2
Version: 2.7.3
Location: /path/to/virtualenv/lib/python2.7/site-packages
Requires: markupsafe

In älteren Versionen pip freezeund grepsollte den Job gut machen.

$ pip freeze | grep Jinja2
Jinja2==2.7.3
AdamKG
quelle
8
@techtonik: Es dient zum Einfrieren aktueller Module in eine Anforderungen.txt.
Hugo
@ Hugo: Ich würde saveName verwenden.
Anatoly Techtonik
5
Die Benennung von "Einfrieren" ist historisch - sie stammt mindestens aus dem Jahr 2008 . Zu dieser Zeit waren viele Leute bereits mit dem "Einfrieren" von Rubinsteinen vertraut, weshalb Pip den damals weit verbreiteten Namen auslieh.
AdamKG
2
Dies war weder offensichtlich noch dokumentiert, aber Sie können eingeben pip show pip, um die Versionsinformationen von pip zu erhalten, anstatt pip --versionwie erwartet.
Marc Maxmeister
pip freezehat den Vorteil, dass bearbeitbare VCS-Checkout-Versionen korrekt angezeigt werden, dies pip showjedoch nicht.
Spookylukey
63

Ich habe gerade eine Pull-Anfrage in Pip mit der Verbesserung gesendet, die Hugo Tavares sagte:

(Specloud als Beispiel)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio
BernardoBarreto
quelle
2
Sieht aus wie es ist fusionierte bereits.
Anatoly Techtonik
43

Pip 1.3 hat jetzt auch einen Listenbefehl :

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)
RickyA
quelle
Angenommen, der Paketname ist X. So finden Sie die Version - Was ist der Unterschied zwischen der Verwendung der Pip-Liste und dem Import von X und dann X .__ Version__? Sind beide Paketversionen?
Variable
beide sind gültig, aber pip listgenerisch und __version__nicht. Ich habe auch gesehen version()und get_version()für die importierte.
RickyA
35

und mit --outdated als zusätzlichem Argument erhalten Sie die aktuelle und die neueste Version der von Ihnen verwendeten Pakete:

$ pip list --outdated
distribute (Current: 0.6.34 Latest: 0.7.3)
django-bootstrap3 (Current: 1.1.0 Latest: 4.3.0)
Django (Current: 1.5.4 Latest: 1.6.4)
Jinja2 (Current: 2.6 Latest: 2.8)

Kombinieren Sie also mit der Antwort von AdamKG:

$ pip list --outdated | grep Jinja2
Jinja2 (Current: 2.6 Latest: 2.8)

Überprüfen Sie auch die Pip-Tools : https://github.com/nvie/pip-tools

KevinS
quelle
1
Eine interessante Option. Ich möchte lieber alle auflisten lassen und mich wissen lassen, ob einer von ihnen veraltet ist.
ArtOfWarfare
17

Sie können auch installieren yolkund dann ausführen, yolk -lwas auch eine schöne Ausgabe liefert. Folgendes bekomme ich für meine kleine virtuelle Umgebung:

(venv)CWD> /space/vhosts/pyramid.xcode.com/venv/build/unittest 
project@pyramid 43> yolk -l
Chameleon       - 2.8.2        - active 
Jinja2          - 2.6          - active 
Mako            - 0.7.0        - active 
MarkupSafe      - 0.15         - active 
PasteDeploy     - 1.5.0        - active 
Pygments        - 1.5          - active 
Python          - 2.7.3        - active development (/usr/lib/python2.7/lib-dynload)
SQLAlchemy      - 0.7.6        - active 
WebOb           - 1.2b3        - active 
account         - 0.0          - active development (/space/vhosts/pyramid.xcode.com/project/account)
distribute      - 0.6.19       - active 
egenix-mx-base  - 3.2.3        - active 
ipython         - 0.12         - active 
logilab-astng   - 0.23.1       - active 
logilab-common  - 0.57.1       - active 
nose            - 1.1.2        - active 
pbkdf2          - 1.3          - active 
pip             - 1.0.2        - active 
pyScss          - 1.1.3        - active 
pycrypto        - 2.5          - active 
pylint          - 0.25.1       - active 
pyramid-debugtoolbar - 1.0.1        - active 
pyramid-tm      - 0.4          - active 
pyramid         - 1.3          - active 
repoze.lru      - 0.5          - active 
simplejson      - 2.5.0        - active 
transaction     - 1.2.0        - active 
translationstring - 1.1          - active 
venusian        - 1.0a3        - active 
waitress        - 0.8.1        - active 
wsgiref         - 0.1.2        - active development (/usr/lib/python2.7)
yolk            - 0.4.3        - active 
zope.deprecation - 3.5.1        - active 
zope.interface  - 3.8.0        - active 
zope.sqlalchemy - 0.7          - active 
Gustavo
quelle
9

Sie können den Befehl grep verwenden, um dies herauszufinden.

pip show <package_name>|grep Version

Beispiel:

pip show urllib3|grep Version

zeigt nur die Versionen an.

Metadaten-Version: 2.0
Version: 1.12

Rajiv
quelle
8

Der einfachste Weg ist folgender:

import jinja2
print jinja2.__version__
user5730083
quelle
7
Dies funktioniert nur für Pakete, die __version__im Quellcode definiert wurden. Viele Pakete nicht.
Spookylukey
Ist es empfehlenswert, diese Version beim Packen einzuschließen, oder empfiehlt es sich, nur die Version im Versionsparameter der Datei setup.py zu haben?
Variable
Diese Methode ist auch nicht robust gegenüber Inkonsistenzen bei der Paketbenennung (es gibt mindestens 3 Typen) zwischen der erwarteten Eingabe von importund der Ausgabe von pip freeze.
Mirekphd
6

Es gibt auch ein Tool namens, pip-checkdas Ihnen einen schnellen Überblick über alle installierten Pakete und deren Aktualisierungsstatus gibt:

Geben Sie hier die Bildbeschreibung ein

Ich habe es selbst nicht benutzt. bin nur darauf gestoßen und diese SO-Frage in schneller Folge, und da sie nicht erwähnt wurde ...

Ola Tuvesson
quelle
Wie man dies unter Windows
ausführt
1
@vela Ich gehe davon aus, dass es unter Windows genauso funktionieren würde. Natürlich müssten Sie es zuerst installieren , wie Sie es auf jedem System tun würden.
Ola Tuvesson
5

Unter Windows können Sie folgende Befehle ausführen:

pip show setuptools | findstr "Version"

Ausgabe:

Version: 34.1.1
Quinn
quelle
2

Die Python-Funktion gibt nur die Paketversion in einem maschinenlesbaren Format zurück:

from importlib.metadata import version 
version('numpy')

Vor Python 3.8:

pip install importlib-metadata 
from importlib_metadata import version
version('numpy')

Das Bash-Äquivalent (hier auch von Python aufgerufen) wäre viel komplexer (aber robuster - siehe Vorsicht unten):

import subprocess
def get_installed_ver(pkg_name):
    bash_str="pip freeze | grep -w %s= | awk -F '==' {'print $2'} | tr -d '\n'" %(pkg_name)
    return(subprocess.check_output(bash_str, shell=True).decode())

Beispielnutzung:

# pkg_name="xgboost"
# pkg_name="Flask"
# pkg_name="Flask-Caching"
pkg_name="scikit-learn"

print(get_installed_ver(pkg_name))
>>> 0.22

Beachten Sie, dass der pkg_nameParameter in beiden Fällen den Paketnamen in dem Format enthalten sollte, das von zurückgegeben pip freezeund nicht verwendet wird import, z. B. scikit-learnnicht sklearnoder Flask-Cachingnicht flask_caching.

Beachten Sie, dass das Aufrufen pip freezein der Bash-Version zwar ineffizient erscheint, sich jedoch nur diese Methode als ausreichend robust erweist, um Besonderheiten und Inkonsistenzen bei der Paketbenennung zu vermeiden (z. B. Unterstriche gegenüber Bindestrichen, Small- und Large-Caps und Abkürzungen wie sklearnvs scikit-learn).

Achtung: In komplexen Umgebungen können beide Varianten überraschende Versionsnummern zurückgeben, die nicht mit dem übereinstimmen, was Sie tatsächlich erhalten können import.

Ein solches Problem tritt auf, wenn andere Versionen des Pakets in einem Benutzerunterordner versteckt sind site-packages. Zur Veranschaulichung der Gefahren bei der Verwendung version()hier eine Situation, auf die ich gestoßen bin:

$ pip freeze | grep lightgbm
lightgbm==2.3.1

and

$ python -c "import lightgbm; print(lightgbm.__version__)"
2.3.1

vs.

$ python -c "from importlib_metadata import version; print(version(\"lightgbm\"))"
2.2.3

until you delete the subfolder with the old version (here 2.2.3) from the user folder (only one would normally be preserved by `pip` - the one installed as last with the `--user` switch):

$ ls /home/jovyan/.local/lib/python3.7/site-packages/lightgbm*
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.2.3.dist-info
/home/jovyan/.local/lib/python3.7/site-packages/lightgbm-2.3.1.dist-info

Ein weiteres Problem besteht darin, dass einige von Conda installierte Pakete in derselben Umgebung installiert sind. Wenn sie Abhängigkeiten mit Ihren von Pip installierten Paketen gemeinsam nutzen und sich die Versionen dieser Abhängigkeiten unterscheiden, erhalten Sie möglicherweise Downgrades Ihrer von Pip installierten Abhängigkeiten.

Zur Veranschaulichung war die neueste Version von numpyPyPI am 04-01-2020 1.18.0, während gleichzeitig Anacondas conda-forgeKanal nur die Version 1.17.3 numpyals neueste Version hatte . Wenn Sie also ein basemapPaket mit conda (als zweites) installiert haben, wird Ihre zuvor numpyper Pip installierte Version von conda auf 1.17.3 herabgestuft, und Version 1.18.0 ist für die importFunktion nicht mehr verfügbar . In diesem Fall version()wäre richtig und pip freeze/ oder conda listfalsch:

$ python -c "from importlib_metadata import version; print(version(\"numpy\"))"
1.17.3

$ python -c "import numpy; print(numpy.__version__)"
1.17.3

$ pip freeze | grep numpy
numpy==1.18.0

$ conda list | grep numpy
numpy                     1.18.0                   pypi_0    pypi
mirekphd
quelle
1
Warum nicht verwenden importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…
sinoroc
1
Toller Fund @sinoroc! Ich denke, Sie sollten es als Antwort posten, und ich werde meine ziemlich from importlib_metadata import version; version('Flask-Caching')
überentwickelte
1
Ich werde dich gehen lassen
sinoroc
Ihre neuesten Änderungen überraschen mich. Könnten Sie es versuchen python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?
Sinoroc
Diese gibt Ihnen die richtige Antwort - die neueste installierte Version (2.3.1), wenn version()immer noch die früheste (älteste) (2.2.3) zurückgegeben wird. Sie können dieses Ergebnis replizieren, indem Sie beide Versionen mit dem --userSwitch installieren , aber den lightgbm-2.2.3.dist-infoOrdner manuell beibehalten, um beide zusammen zu haben, wie oben aufgeführt (pip würde ihn normalerweise entfernen - bis dies nicht der Fall ist).
Mirekphd
1

pip show funktioniert in Python 3.7:

pip show selenium
Name: selenium
Version: 4.0.0a3
Summary: Python bindings for Selenium
Home-page: https://github.com/SeleniumHQ/selenium/
Author: UNKNOWN
Author-email: UNKNOWN
License: Apache 2.0
Location: c:\python3.7\lib\site-packages\selenium-4.0.0a3-py3.7.egg
Requires: urllib3
Required-by:
Superstone
quelle
Es ist keine Standardantwort.
Hamed Baziyad
1

So verwenden Sie Python-Code:

Verwenden von importlib.metadata.version

Python ≥3,8

import importlib.metadata
importlib.metadata.version('beautifulsoup4')
'4.9.1'

Python ≤3,7

(mit importlib_metadata.version)

!pip install importlib-metadata

import importlib_metadata
importlib_metadata.version('beautifulsoup4')
'4.9.1'

Verwenden von pkg_resources.Distribution

import pkg_resources
pkg_resources.get_distribution('beautifulsoup4').version
'4.9.1'
pkg_resources.get_distribution('beautifulsoup4').parsed_version
<Version('4.9.1')>

Gutgeschrieben auf Kommentare von sinoroc und mirekphd .

Scharfsinn
quelle
0

Für Windows können Sie

  1. Öffnen Sie cmd und geben Sie Python ein. Drücken Sie die Eingabetaste.

  2. Geben Sie den Import ein und drücken Sie die Eingabetaste.

  3. Geben Sie ._version__ ein und drücken Sie die Eingabetaste.

Wie Sie im Screenshot hier sehen können, verwende ich diese Methode zum Überprüfen der Version des seriellen Moduls.

Bild


joker2368
quelle
0

In Frage wird nicht erwähnt, welches Betriebssystem Benutzer verwendet (Windows / Linux / Mac)

Da gibt es einige Antworten, die unter Mac und Linux einwandfrei funktionieren.

Der folgende Befehl kann verwendet werden, wenn der Benutzer versucht, die Version eines Python-Pakets unter Windows zu finden.

Verwenden Sie in PowerShell den folgenden Befehl:

pip list | findstr <PackageName>

Beispiel:- pip list | findstr requests

Ausgabe : requests 2.18.4

Ashwani Singh
quelle