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
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
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)
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
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
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 import
z.B scikit-learn
nicht sklearn
oder Flask-Caching
nicht 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