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

Lesezeit: 6 Minuten

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

ich weiss Bescheid pip install XYZ --upgrade aber ich frage mich, ob es so etwas gibt pip info XYZ. Wenn nicht, wie kann ich am besten feststellen, welche Version ich derzeit verwende?

Ab Pip 1.3da ist ein pip show Befehl.

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

Bei älteren Versionen pip freeze und grep sollte die Arbeit gut machen.

$ pip freeze | grep Jinja2
Jinja2==2.7.3

  • @techtonik: Es ist für Einfrieren aktueller Module zu einer requirements.txt.

    – Hugo

    15. Februar 2014 um 10:59 Uhr

  • @Hugo: Ich würde verwenden save Name.

    – anatoly techtonik

    17. Februar 2014 um 16:31 Uhr

  • Die Benennung von „Freeze“ ist historisch – sie geht auf zurück mindestens 2008. Zu dieser Zeit waren viele Menschen bereits mit „einfrierenden“ Rubinen vertraut, also entlehnte sich Pip den damals weit verbreiteten Namen.

    – AdamKG

    17. Februar 2014 um 21:54 Uhr

  • Dies war weder offensichtlich noch dokumentiert, aber Sie können es eingeben pip show pip um die Versionsinformationen von Pip zu erhalten, anstatt pip --version wie ich erwartet hätte.

    – Mark Maxmeister

    11. Januar 2016 um 18:55 Uhr

  • pip freeze hat den Vorteil, dass es bearbeitbare VCS-Checkout-Versionen korrekt anzeigt, während pip show nicht.

    – unheimlich

    28. Juli 2016 um 6:38 Uhr

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

(specloud als Beispiel)

$ pip show specloud

Package: specloud
Version: 0.4.4
Requires:
nose
figleaf
pinocchio

  • Sieht so aus zusammengeführt schon.

    – anatoly techtonik

    14. Januar 2014 um 8:48 Uhr

Benutzer-Avatar
Ricky A

Pip 1.3 hat jetzt auch eine aufführen Befehl:

$ pip list
argparse (1.2.1)
pip (1.5.1)
setuptools (2.1)
wsgiref (0.1.2)

  • Angenommen, der Paketname ist X. Um die Version zu finden – Was ist der Unterschied zwischen der Verwendung der Pip-Liste und dem Importieren von X und dann X.__Version__? Sind beide Paketversionen?

    – variabel

    13. Oktober 2019 um 4:27 Uhr


  • beide sind gültig, aber pip list ist generisch, und __version__ ist nicht. habe ich auch gesehen version() und get_version() für den importierten.

    – Ricky A

    14. Oktober 2019 um 8:35 Uhr

und mit –outdated als zusätzliches Argument erhalten Sie die aktuellen und neuesten Versionen 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)

Also in Kombination mit der Antwort von AdamKG:

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

Prüfen Pip-Tools zu : https://github.com/nvie/pip-tools

Sie können auch installieren yolk und dann laufen yolk -l was auch eine schöne Ausgabe liefert. Hier ist, was ich für meine kleine virtuelle Umgebung bekomme:

(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 

Benutzer-Avatar
Rajiv

Sie können den grep-Befehl 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

Benutzer-Avatar
Asklepios

Die Python-Funktion, die nur die Paketversion in einem maschinenlesbaren Format zurückgibt:

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 dies in beiden Fällen pkg_name Der Parameter sollte den Paketnamen im Format enthalten, wie er von zurückgegeben wird pip freeze und nicht wie während verwendet importz.B scikit-learn nicht sklearn oder Flask-Cachingnicht flask_caching.

Beachten Sie dies beim Aufrufen pip freeze in der Bash-Version mag ineffizient erscheinen, nur diese Methode erweist sich als ausreichend robust gegenüber Besonderheiten und Inkonsistenzen bei der Paketbenennung (z. B. Unterstriche vs. Bindestriche, Kapitälchen vs. Großbuchstaben und Abkürzungen wie sklearn vs 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 a versteckt sind Benutzer site-packages Unterordner. Als Veranschaulichung der Gefahren der Verwendung version() hier ist 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 conda-installierte Pakete in derselben Umgebung vorhanden sind. Wenn sie Abhängigkeiten mit Ihren von Pip installierten Paketen teilen und Versionen dieser Abhängigkeiten unterschiedlich sind, erhalten Sie möglicherweise Downgrades Ihrer von Pip installierten Abhängigkeiten.

Zur Veranschaulichung, die neueste Version von numpy verfügbar in PyPI am 01.04.2020 war 1.18.0, während gleichzeitig Anacondas conda-forge Kanal hatte nur Version 1.17.3 auf numpy als ihr neustes. Wenn Sie also eine installiert haben basemap Paket mit Conda (als zweites), Ihr zuvor installiertes Pip numpy würde von conda auf 1.17.3 heruntergestuft, und Version 1.18.0 würde für die nicht mehr verfügbar sein import Funktion. In diesem Fall version() wäre richtig, und pip freeze/conda list falsch:

$ 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

  • Warum nicht verwenden importlib.metadata.version('NameOfProject')? docs.python.org/3/library/…

    – Sinoroc

    30. Dezember 2019 um 15:32 Uhr

  • Toller Fund @sinoroc! Ich denke, Sie sollten es als Antwort posten, und ich werde mein ziemlich überarbeitetes löschen 🙂 Beispiel-PoC: from importlib_metadata import version; version('Flask-Caching')

    – mirekphd

    30. Dezember 2019 um 15:41 Uhr


  • Ich lasse dich gehen

    – Sinoroc

    30. Dezember 2019 um 15:43 Uhr

  • Ihre neuesten Bearbeitungen überraschen mich. Könntest du es versuchen python -c "import pkg_resources; print(pkg_resources.get_distribution('lightgbm').version)"?

    – Sinoroc

    5. Januar 2020 um 17:38 Uhr

  • Das gibt Ihnen die richtige Antwort – die neueste installierte Version (2.3.1), wann version() gibt immer noch die früheste (älteste) (2.2.3) zurück. Sie können dieses Ergebnis replizieren, indem Sie beide Versionen mit installieren --user umschalten, aber manuell beibehalten lightgbm-2.2.3.dist-info Ordner, um beide zusammen zu haben, wie oben aufgeführt (pip would normalerweise entfernen – bis dies nicht mehr der Fall ist).

    – mirekphd

    6. Januar 2020 um 10:41 Uhr


1146290cookie-checkFinden Sie heraus, welche Version des Pakets mit Pip installiert ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy